我正在导入一些具有测量数据的csv文件。根据测量日期和测量设备的不同,这些文件有不同的名称。我按时间顺序将对应于同一设备的文件附加在一起。
我有以下代码:
import numpy as np
import pandas as pd
import os
sonicpath = *PathtoFiles*
def import_sonic():
Dates = np.array([1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029,
1030, 1031, 1101, 1102])+20210000
Sensors = ['UwGilHs40', 'UwGilHs135', 'UwmetuS20', 'UwmetuS20', 'UwMetuS60',
'UwMetuS100', 'UwMetuS188', 'UwThi3DH80', 'UwThi3DH140']
Ext = 'csv'
dic_sonics = {}
for Sensor in Sensors:
Filenames = []
dic_sonics[Sensor] = pd.DataFrame([])
for Date in Dates:
Filenames.append('.'.join(['_'.join([str(Date), Sensor]), Ext]))
for Filename in Filenames:
with open(os.path.join(sonicpath, Filename)) as f:
lines = f.readlines()
count = 0
for line in lines:
if 'Timestamp' not in line:
count = count+1
else:
skip = count-1
break
dic_sonics[Sensor] = dic_sonics[Sensor].append(
pd.read_csv(os.path.join(sonicpath, Filename),
skiprows = skip, header=1, sep = ';', decimal='.',
), ignore_index = True)
timestamps = dic_sonics[Sensor].loc[:, 'Timestamp']
# round to seconds and convert to unix Timestamp
for its in timestamps.index:
dic_sonics[Sensor].loc[its, 'Timestamp'] = int((timestamps.loc[
its].round('S') - pd.Timestamp("1970-01-01")).total_seconds())
return(dic_sonics)
我确信有更好的方法来实现我正在做的事情,但现在我的问题:
dic_sonics[Sensor] = dic_sonics[Sensor].append(
pd.read_csv(os.path.join(sonicpath, Filename),
skiprows = skip, header=1, sep = ';', decimal='.',
), ignore_index = True)
当我用Run File选项执行这些代码行时,一切都如预期的那样工作。我得到以下DataFrame列:
指数(["时间戳","数量",‘x_mean’,‘x_min’,‘x_max’,‘x_sigma’,‘y_mean’,‘y_min’,‘y_max’,"y_sigma"、"z_mean’,‘z_min’,‘z_max’,‘z_sigma’,‘T_mean’,‘T_min’,‘T_max’,‘T_sigma’,"vel_mean"、"vel_min’,‘vel_max’,‘vel_sigma’,‘dir_mean’,‘dir_min’,‘dir_max’,‘dir_sigma’,在‘IncX_mean’,‘IncX_min’,‘IncX_max’,‘IncY_mean’,‘IncY_min’,‘IncY_max’),dtype = '对象')
当我用Debug Filepandas执行这些行时,不知何故使用了e作为分隔符。我得到以下DataFrame列(并提出一个错误,因为它找不到列来解析日期):
指数([Tim,‘邮票;数量;x_m’,‘一个;x_min x_max; x_sigma; y_m",";y_min y_max; y_sigma z_m","一个;z_min; z_max; z_sigma; T_m",";T_min T_max; T_sigma; v’,‘l_m’,‘一个;v’,‘l_min; v’,‘l_max; v’,"l_sigma; dir_m"、"一个;dir_min dir_max; dir_sigma"),dtype = '对象')
当我执行Debug File并在导入发生之前设置断点并在控制台上执行该行代码时,它也可以工作。
我真的不明白为什么会发生这种事。为什么熊猫突然使用了不同的分隔符?谢谢你的帮助!
附加信息:
世爵5.3.0
Python 3.7.8
熊猫1.2.3
numpy 1.21.3
感谢免责声明。我已经找到解决问题的办法了。如果有人想复制它,也许提供额外的信息,为什么会发生这种情况,请随意这样做。
首先我们创建文件test.csv并填充data:SerialNumber=
AverageInterval=600
Timestamp;Counts
下面是简化后的代码:
import pandas as pd
df = pd.read_csv('./test.csv', skiprows = 1, header = 1, sep = ';')
print(df.columns)
指数("时间戳","数量",dtype = '对象')
调试输出
指数([Tim, '邮票;计数'],dtype = '对象')
我可以通过改变输入变量来解决我的问题:
import pandas as pd
df = pd.read_csv('./test.csv', skiprows = 2, header = 0, sep = ';')
print(df.columns)
指数("时间戳","数量",dtype = '对象')
调试输出
指数("时间戳","数量",dtype = '对象')