Ada*_*dam 9 python datetime numpy pandas
我有从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
Run Code Online (Sandbox Code Playgroud)
我想找到数据的局部斜率.如果我只是做tmp.diff()我会得到本地值的变化.但是,我希望得到每秒值的变化(时间导数)我想做这样的事情,但这是错误的方法,并给出一个错误:
tmp.diff()/tmp.index.diff()
Run Code Online (Sandbox Code Playgroud)
我已经发现我可以通过将所有数据转换为DataFrame来实现,但这似乎效率低下.特别是,因为我将不得不使用大块的磁盘文件.除此之外,还有更好的方法吗?
df=pd.DataFrame(tmp)
df['secvalue']=df.index.astype(np.int64)/1e+9
df['slope']=df['Value'].diff()/df['secvalue'].diff()
Run Code Online (Sandbox Code Playgroud)
使用 numpy.gradient
import numpy as np
import pandas as pd
slope = pd.Series(np.gradient(tmp.values), tmp.index, name='slope')
Run Code Online (Sandbox Code Playgroud)
为了解决不相等的时间索引,我将在几分钟内重新采样并进行插值。然后我的梯度将在相等的间隔内。
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
Run Code Online (Sandbox Code Playgroud)
df.plot()
Run Code Online (Sandbox Code Playgroud)