大熊猫时间序列与相对时间

时间:2013-07-08 18:46:44

标签: python pandas time-series

我是熊猫的新手,我正在努力弄清楚如何将我的数据转换为时间序列对象。我有传感器数据,其中有一个参考实验开始的相对时间指数。这不是日期/时间格式。我在网上找到的所有文档都以某种日期数据开头/开头。我的数据的一小部分看起来像:

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')

但我只是得到一个索引系列,而不是时间序列。

非常感谢任何帮助。

干杯!

3 个答案:

答案 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)

Beau的方法很好用,但我想避免使用任意的起点。我通常使用TimedeltaIndex制作一个时间序列,这样我才能想到与t0的时差。

time = datalvm['time'][1:]
floatseconds = map(float,time) #str->float
datalvm.index=pd.to_timedelta(floatseconds,unit='s')