我是熊猫的新手,我正在努力弄清楚如何将我的数据转换为时间序列对象。我有传感器数据,其中有一个参考实验开始的相对时间指数。这不是日期/时间格式。我在网上找到的所有文档都以某种日期数据开头/开头。我的数据的一小部分看起来像:
0.000000 49.431958 4.119330 -0.001366 -9.483122E-9
0.025000 49.501745 4.125145 0.004710 2.322330E-8
0.050000 49.479531 4.123294 0.013725 1.185336E-7
0.075000 49.492309 4.124359 0.006082 1.607667E-7
0.325000 49.515702 4.126309 0.024307 9.750522E-7
2.925000 49.437069 4.119756 0.000202 9.148022E-6
3.025000 49.521010 4.126751 0.014313 9.590506E-6
3.425000 49.510001 4.125833 -0.003913 1.075210E-5
时间数据位于第一列。我试着用以下内容加载数据:
datalabels= ['time', 'voltage pack', 'av. cell voltage', 'current', 'charge count', 'soc', 'energy', 'unknown1', 'unknown2', 'unknown3']
datalvm= pd.read_csv(dpath+dfile, header=None, skiprows=25, names=datalabels, delimiter='\t', parse_dates={'Timestamp':['time']}, index_col='Timestamp')
但我只是得到一个索引系列,而不是时间序列。
非常感谢任何帮助。
干杯!
答案 0 :(得分:3)
您应该通过将时间戳解析为dateTime对象来构造pandas TimeSeries对象。这需要你选择一些任意的起点
start = dt.datetime(year=2000,month=1,day=1)
time = datalvm['time'][1:]
floatseconds = map(float,time) #str->float
#floats to datetime objects -> this is you timeseries index
datetimes = map(lambda x:dt.timedelta(seconds=x)+start,floatseconds)
#construct the time series
timeseries = dict() #timeseries are collected in a dictionary
for signal in datalabels[1:]:
data =map(float,datalvm[signal][1:].values)
t_s = pd.Series(data,index=datetimes,name=signal)
timeseries[signal] = t_s
#convert timeseries dict to dataframe
dataframe = pd.DataFrame(timeseries)
构建timeSeries后,您可以使用resample函数:
dataframe['soc'].resample('1sec')
答案 1 :(得分:1)
你可以使用groupby上的cut
(你可以根据需要指定分档),或者你想要的分组,使用上面的数据(这就是我通过StringIO
阅读的原因)
In [22]: df= pd.read_csv(StringIO(data), header=None, delimiter='\s+')
In [23]: df.columns = ['time','col1','col2','col3','col4']
In [24]: df
Out[24]:
time col1 col2 col3 col4
0 0.000 49.431958 4.119330 -0.001366 -9.483122e-09
1 0.025 49.501745 4.125145 0.004710 2.322330e-08
2 0.050 49.479531 4.123294 0.013725 1.185336e-07
3 0.075 49.492309 4.124359 0.006082 1.607667e-07
4 0.325 49.515702 4.126309 0.024307 9.750522e-07
5 2.925 49.437069 4.119756 0.000202 9.148022e-06
6 3.025 49.521010 4.126751 0.014313 9.590506e-06
7 3.425 49.510001 4.125833 -0.003913 1.075210e-05
In [25]: df.groupby(pd.cut(df['time'],2)).sum()
Out[25]:
time col1 col2 col3 col4
time
(-0.00343, 1.712] 0.475 247.421245 20.618437 0.047458 0.000001
(1.712, 3.425] 9.375 148.468080 12.372340 0.010602 0.000029
答案 2 :(得分:1)
time = datalvm['time'][1:]
floatseconds = map(float,time) #str->float
datalvm.index=pd.to_timedelta(floatseconds,unit='s')