计算系列

时间:2016-08-30 19:33:18

标签: python pandas datetime numpy

我有从hdf5文件导入的数据。所以,它看起来像这样:

import pandas as pd
tmp=pd.Series([1.,3.,4.,3.,5.],['2016-06-27 23:52:00','2016-06-27 23:53:00','2016-06-27 23:54:00','2016-06-27 23:55:00','2016-06-27 23:59:00'])
tmp.index=pd.to_datetime(tmp.index)

>>>tmp
2016-06-27 23:52:00    1.0
2016-06-27 23:53:00    3.0
2016-06-27 23:54:00    4.0
2016-06-27 23:55:00    3.0
2016-06-27 23:59:00    5.0
dtype: float64

我想找到数据的局部斜率。如果我只是做tmp.diff()我会得到本地值的变化。但是,我想获得每秒价值的变化(时间导数) 我想做这样的事情,但这是错误的做法并给出错误:

tmp.diff()/tmp.index.diff()

我已经发现我可以通过将所有数据转换为DataFrame来实现,但这似乎效率低下。特别是,因为我将不得不使用大块的磁盘文件。 除此之外,还有更好的方法吗?

df=pd.DataFrame(tmp)
df['secvalue']=df.index.astype(np.int64)/1e+9
df['slope']=df['Value'].diff()/df['secvalue'].diff()

1 个答案:

答案 0 :(得分:4)

使用numpy.gradient

import numpy as np
import pandas as pd

slope = pd.Series(np.gradient(tmp.values), tmp.index, name='slope')

为了解决不等时间索引,我会在几分钟内重新采样并进行插值。然后我的渐变将是相等的间隔。

tmp_ = tmp.resample('T').interpolate()

slope = pd.Series(np.gradient(tmp_.values), tmp_.index, name='slope')

df = pd.concat([tmp_.rename('values'), slope], axis=1)
df

enter image description here

df.plot()

enter image description here