pandas
时间
移动窗口
看过来
《pandas 教程》 持续更新中,可作为 pandas 入门进阶课程、pandas 中文手册、用法大全,配有案例讲解和速查手册。提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。查看更新日志。作者开办 Python 数据分析训练营正在报名中,详情 Python 数据分析训练营。
![]() |
本教程作者所著新书《Python之光:Python编程入门与实战》(ISBN:9787111729891)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
![]() |
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
可以将偏移量(或可转换)传递给.rolling() 方法,并使其根据传递的时间窗口生成可变大小的窗口。 对于每个时间点,这包括在指示的时间增量内出现的所有先前值。
这对于非规则的时频索引尤其有用:
dft = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]},
index=pd.date_range('20130101 09:00:00',
periods=5,
freq='s'))
dft
'''
B
2013-01-01 09:00:00 0.0
2013-01-01 09:00:01 1.0
2013-01-01 09:00:02 2.0
2013-01-01 09:00:03 NaN
2013-01-01 09:00:04 4.0
'''
dft.rolling(2).sum()
'''
B
2013-01-01 09:00:00 NaN
2013-01-01 09:00:01 1.0
2013-01-01 09:00:02 3.0
2013-01-01 09:00:03 NaN
2013-01-01 09:00:04 NaN
'''
dft.rolling(2, min_periods=1).sum()
'''
B
2013-01-01 09:00:00 0.0
2013-01-01 09:00:01 1.0
2013-01-01 09:00:02 3.0
2013-01-01 09:00:03 2.0
2013-01-01 09:00:04 4.0
'''
dft.rolling('2s').sum()
在先前的版本中,如果针对行索引为时间日期型的数据框进行 rolling 滑窗操作使用 center 参数将每行记录作为窗口中心时会报错。pandas 1.3.0 版本解决了这个问题:
df = pd.DataFrame(
{"A": [0, 1, 2, 3, 4]},
index=pd.date_range("2020", periods=5, freq="1D")
)
df
'''
A
2020-01-01 0
2020-01-02 1
2020-01-03 2
2020-01-04 3
2020-01-05 4
'''
df.rolling("2D").mean()
'''
A
2020-01-01 0.0
2020-01-02 0.5
2020-01-03 1.5
2020-01-04 2.5
2020-01-05 3.5
'''
df.rolling("2D", center=True).mean()
'''
A
2020-01-01 0.5
2020-01-02 1.5
2020-01-03 2.5
2020-01-04 3.5
2020-01-05 4.0
'''
dft = dft.reset_index()
dft.rolling('2s', on='foo').sum()
将 .rolling() 与基于时间的索引一起使用非常类似于重采样。它们既对时间索引的 Pandas 对象进行操作又执行还原操作。
当使用带有偏移量的.rolling() 时。偏移量是时间增量。取得一个向后看的窗口,并汇总该窗口中的所有值(包括终点,但不包括起点)。这是结果中此时的新值。对于输入的每个点,这些都是时空可变大小的窗口,将获得与输入相同大小的结果。
当使用带有偏移量的.resample() 时。构造一个新的索引,它是偏移的频率。对于每个频率仓,在该时间仓中的时间倒退窗口内,从输入汇总点。聚合的结果是该频率点的输出。窗口在频率空间中是固定大小的。您的结果将具有介于原始输入对象的最小值和最大值之间的规则频率形状。
总而言之,.rolling() 是基于时间的窗口操作,而.resample() 是基于频率的窗口操作。