如何将包含多个表的 .dat 文件读取到 pandas 数据框中?
How can I read .dat file containing multiple tables into a pandas data frame?
我有一个测量设备,在.dat文件中记录数据,如raw_data.dat在this folder,都具有相同的结构,我希望能够提取最后一个table 在文件中放入 pandas 数据框。
该文件有几个 table,我不确定这里的制表结构是否是 .dat 文件的标准,但我尝试将文本粘贴到 excel 中,它识别文本作为单独的 table,因此可能有一种相当标准的方法可以将结构正确读入 python。我找不到一个,所以我尝试了一种非常复杂的方法,将 .dat 文件读入一个字符串,然后手动切掉部分文件的顶部并将其余部分保存为 .dat 文件。我的希望是以某种方式能够将结果保存为 .csv 或 .xls,但我仍然找不到如何做到这一点。此外,导入后制表被转换为 \t's,这不会返回到保存文件中的制表。我的代码如下
mylines = []
with open ('raw_file.dat', 'rt') as myfile:
for myline in myfile:
mylines.append(myline)
string = (mylines[8:])
with open("updated.dat", "w") as output:
output.write(str(string))
我必须承认我是 python 的新手,我不确定我是否正确使用了这些功能。不过,我希望有比我正在尝试的解决方法更直接的方法来解决这个问题。
如果您可以确定您想要的第三个 table 从第 8 行开始,那么您没有理由让它比从第 8 行开始索引文件更复杂。从那里,您可以使用字符串操作和列表理解来清理数据:
import pandas as pd
# Read the data.
with open('raw_data.dat', 'r') as fh:
lines = fh.readlines()[8:]
# Remove newlines, tabs, and split each string separated by spaces.
clean = [line.strip.replace('\t', '').split() for line in lines]
# Feed the data into a DataFrame.
data = pd.DataFrame(clean[1:], columns=clean[0])
输出:
Time Variab1e1 ... v18 v19
0 +0.00000000e+000 +3.04142181e-002 ... +0.00000000e+000 +0.00000000e+000
1 +1.00000000e+000 +1.96144191e-001 ... +1.00000000e+000 +0.00000000e+000
2 +2.00000000e+000 +3.75599731e-001 ... +2.00000000e+000 +0.00000000e+000
如果要将值转换为浮点数,可以在将数据转换为 DataFrame 之前执行此操作:
headers = clean[0]
rows = [[float(value) for value in row] for row in clean[1:]]
data = pd.DataFrame(rows, columns=headers)
这让你的框架更清晰:
Time Variab1e1 Variable2 Variable3 Variable4 ... v15 v16 v17 v18 v19
0 0.0 0.030414 0.0 1.383808 0.0 ... 0.0 0.0 15.0 0.0 0.0
1 1.0 0.196144 1.0 7.660262 1.0 ... 0.0 1.0 15.0 1.0 0.0
2 2.0 0.375600 2.0 15.356726 2.0 ... 0.0 2.0 15.0 2.0 0.0
我有一个测量设备,在.dat文件中记录数据,如raw_data.dat在this folder,都具有相同的结构,我希望能够提取最后一个table 在文件中放入 pandas 数据框。
该文件有几个 table,我不确定这里的制表结构是否是 .dat 文件的标准,但我尝试将文本粘贴到 excel 中,它识别文本作为单独的 table,因此可能有一种相当标准的方法可以将结构正确读入 python。我找不到一个,所以我尝试了一种非常复杂的方法,将 .dat 文件读入一个字符串,然后手动切掉部分文件的顶部并将其余部分保存为 .dat 文件。我的希望是以某种方式能够将结果保存为 .csv 或 .xls,但我仍然找不到如何做到这一点。此外,导入后制表被转换为 \t's,这不会返回到保存文件中的制表。我的代码如下
mylines = []
with open ('raw_file.dat', 'rt') as myfile:
for myline in myfile:
mylines.append(myline)
string = (mylines[8:])
with open("updated.dat", "w") as output:
output.write(str(string))
我必须承认我是 python 的新手,我不确定我是否正确使用了这些功能。不过,我希望有比我正在尝试的解决方法更直接的方法来解决这个问题。
如果您可以确定您想要的第三个 table 从第 8 行开始,那么您没有理由让它比从第 8 行开始索引文件更复杂。从那里,您可以使用字符串操作和列表理解来清理数据:
import pandas as pd
# Read the data.
with open('raw_data.dat', 'r') as fh:
lines = fh.readlines()[8:]
# Remove newlines, tabs, and split each string separated by spaces.
clean = [line.strip.replace('\t', '').split() for line in lines]
# Feed the data into a DataFrame.
data = pd.DataFrame(clean[1:], columns=clean[0])
输出:
Time Variab1e1 ... v18 v19
0 +0.00000000e+000 +3.04142181e-002 ... +0.00000000e+000 +0.00000000e+000
1 +1.00000000e+000 +1.96144191e-001 ... +1.00000000e+000 +0.00000000e+000
2 +2.00000000e+000 +3.75599731e-001 ... +2.00000000e+000 +0.00000000e+000
如果要将值转换为浮点数,可以在将数据转换为 DataFrame 之前执行此操作:
headers = clean[0]
rows = [[float(value) for value in row] for row in clean[1:]]
data = pd.DataFrame(rows, columns=headers)
这让你的框架更清晰:
Time Variab1e1 Variable2 Variable3 Variable4 ... v15 v16 v17 v18 v19
0 0.0 0.030414 0.0 1.383808 0.0 ... 0.0 0.0 15.0 0.0 0.0
1 1.0 0.196144 1.0 7.660262 1.0 ... 0.0 1.0 15.0 1.0 0.0
2 2.0 0.375600 2.0 15.356726 2.0 ... 0.0 2.0 15.0 2.0 0.0