2

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

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

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

任何帮助将不胜感激。

干杯!

4

3 回答 3

4

您应该通过将时间戳解析为 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')
于 2013-07-09T12:27:30.097 回答
1

您可以使用上面的数据cut在 groupby (如果需要,可以指定 bin)或 groupby 上进行操作(这就是我阅读的原因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
于 2013-07-08T20:25:11.973 回答
1

Beau 的方法效果很好,但我想避免使用任意的起点。我通常使用 TimedeltaIndex 来制作时间序列,这样我就只能考虑与 t0 的时间差。

time = datalvm['time'][1:]
floatseconds = map(float,time) #str->float
datalvm.index=pd.to_timedelta(floatseconds,unit='s') 
于 2015-12-16T13:29:29.307 回答