在带有时间索引的pandas数据帧上滚动积分

时间:2018-07-10 16:33:13

标签: pandas numpy scipy pandas-groupby

我想用时间索引捕获数据框的一列的整数。对于每个时间间隔进行的分组,这种方法都很好。

from scipy import integrate
>>> df

Time                      A
2017-12-18 19:54:40   -50187.0
2017-12-18 19:54:45   -60890.5
2017-12-18 19:54:50   -28258.5
2017-12-18 19:54:55    -8151.0
2017-12-18 19:55:00    -9108.5
2017-12-18 19:55:05   -12047.0
2017-12-18 19:55:10   -19418.0
2017-12-18 19:55:15   -50686.0
2017-12-18 19:55:20   -57159.0
2017-12-18 19:55:25   -42847.0

>>> integral_df = df.groupby(pd.Grouper(freq='25S')).apply(integrate.trapz)

Time                       A
2017-12-18 19:54:35   -118318.00
2017-12-18 19:55:00   -115284.75
2017-12-18 19:55:25         0.00
Freq: 25S, Name: A, dtype: float64

编辑:

scipy积分函数自动使用时间索引来计算其结果。

这不是事实。您必须将转换显式传递给np datetime,以便scipy.integrate.trapz使用时间正确地进行积分。请参阅我对这个问题的评论。

但是,我想取一个滚动积分。我已经尝试过Using rolling functions found on SO,但是当我尝试对集成函数进行输入时,代码变得混乱了,因为这些滚动函数不会返回数据帧。

如何随时间推移对其中一个数据框列的函数进行滚动积分?

1 个答案:

答案 0 :(得分:2)

将时间设置为索引,并与df.rolling一起应用

df.Time = pd.to_datetime(df.Time)
df = df.set_index('Time')
df.rolling('25S').apply(integrate.trapz)

#outputs:

2017-12-18 19:54:40         0.00
2017-12-18 19:54:45    -55538.75
2017-12-18 19:54:50   -100113.25
2017-12-18 19:54:55   -118318.00
2017-12-18 19:55:00   -126947.75
2017-12-18 19:55:05    -81986.75
2017-12-18 19:55:10    -53144.75
2017-12-18 19:55:15    -69992.00
2017-12-18 19:55:20   -115284.75
2017-12-18 19:55:25   -154710.00

这是AA-rolling-integrated的情节:

A & A rolling integrated with window 25s