python - 计算Series的局部时间导数

标签 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() 我确实得到了值(value)的局部变化。但是,我想获得每秒值的变化(时间导数) 我想做这样的事情,但这是错误的做法并给出了错误:

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

我发现我可以通过将所有数据转换为 DataFrame 来做到这一点,但这似乎效率不高。特别是,因为我将不得不分 block 处理磁盘上的大型文件。 除了这个还有更好的方法吗:

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

最佳答案

使用numpy.gradient

import numpy as np
import pandas as pd

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

为了解决时间索引不相等的问题,我会在几分钟内重新采样并进行插值。那么我的梯度将在相等的间隔内。

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

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

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

enter image description here

df.plot()

enter image description here

关于python - 计算Series的局部时间导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39235712/

相关文章:

php - 使用纪元时间但使用不同时区初始化时,DateTime 不会产生相同的时间

python - PyInstaller 中的 Pandas、Numpy

python - 使用 DataFrame 合并(连接)4 个具有不同 ID 和多个值的不同 CSV 文件

java - 天真地用 Clock.systemDefaultZone().millis() 替换 System.currentTimeMillis() 是否安全?

python - 在opencv-python中更改视频源时图像检测不佳

python - 使用 python,选择长于 N 的重复元素

C#格式化时间 "On The Hour"

python - 如何在 keras 或 tensorflow 中使用 ImageDataGenerator 获取相同的增强图像?

python - 有什么方法可以扩展 python 中的 threading.Timer

python - 使用 python PRAW 提取 reddit 评论并使用结果创建数据框