pandas滚动窗口函数rolling参数详解与实战应用

Noah
Noah
发布时间:2026-10-13 | 6人浏览过
原创

本文详解pandas中rolling函数的核心参数与用法。重点解析window类型(int与offset)、min_periods、center及closed等关键配置,并通过物流场景示例,展示如何结合groupby实现基于时间的滚动聚合计算,提供高效的数据处理方案。

在构建模型时,处理具有时间关联的数据是常见需求。例如,计算过去30分钟内的销量、产量、速度或消耗量等指标。传统方法往往逻辑复杂且资源消耗较大,而利用pandas提供的rolling函数,不仅操作简便,还能显著提升计算效率。

函数原型及参数说明

DataFrame.rolling(window, min_periods=None, freq=None, center=False, win_type=None, on=None, axis=0, closed=None)

window:定义时间窗的大小,支持两种类型(int或offset)。若使用int,数值代表参与统计计算的观测值数量,即向前追溯的数据条数;若使用offset类型,则代表具体的时间窗口大小。关于pandas offset的详细信息可参考相关文档。

min_periods:设定计算所需的最小有效观测值数量。当window为int类型时,默认值与window相等;当window为offset类型时,默认值为1。

freq:该参数自0.18版本起已被移除,不再使用。

center:指定是否以窗口中间值作为标签,默认为false。此参数仅在window为int类型时生效。

# 为方便观察,并列排列

df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
df.rolling(3, min_periods=1).sum()
df.rolling(3, min_periods=1, center=True).sum()
 B B1 B2
0 0.0 0.0 1.0
1 1.0 1.0 3.0
2 2.0 3.0 3.0
3 NaN 3.0 6.0
4 4.0 6.0 4.0

win_type:指定窗口类型,默认为None,通常无需特殊指定。如需了解支持的其它窗口类型,可参考相关文档。

on:当DataFrame不使用索引(index)作为rolling操作的列时,可通过on参数指定具体使用的列名。

closed:定义区间的开闭状态。该参数曾支持int类型的window,但在新版本中已不再支持。对于offset类型,默认值为left open, right close(即right)。用户可根据实际需求指定为left、both等状态。

axis:指定计算方向(轴),通常默认值为0。

实例演示

以下是一个简单场景:假设从A地向B地运送货物,我们需要观察以3秒为时间窗的运送量。

# A地有两个仓库,都运往B。
df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'],
     '2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'],
     'num': [1,2,1,3,4,2,1]}, 
     index = [pd.Timestamp('20130101 09:00:00'),
       pd.Timestamp('20130101 09:00:01'),
       pd.Timestamp('20130101 09:00:02'),
       pd.Timestamp('20130101 09:00:03'),
       pd.Timestamp('20130101 09:00:04'),
       pd.Timestamp('20130101 09:00:05'),
       pd.Timestamp('20130101 09:00:06')])
# 1 2 num
# 2013-01-01 09:00:00 A1 B1 1
# 2013-01-01 09:00:01 A2 B1 2
# 2013-01-01 09:00:02 A1 B1 1
# 2013-01-01 09:00:03 A2 B1 3
# 2013-01-01 09:00:04 A2 B1 4
# 2013-01-01 09:00:05 A1 B1 2
# 2013-01-01 09:00:06 A2 B1 1

使用rolling进行具体计算

# 首先我们先对groupby进行聚合(如果只有从A->B,那么不用聚合一个rolling就可以)
# 以9:00:04秒为例,由于时间窗是3s,默认的closed是right,所以我们相加04,03,02秒的num,共有4+3+0=7
df.groupby(['1', '2'])['num'].rolling('3s').sum()
# 1 2      
# A1 B1 2013-01-01 09:00:00 1.0
#   2013-01-01 09:00:02 2.0
#   2013-01-01 09:00:05 2.0
# A2 B1 2013-01-01 09:00:01 2.0
#   2013-01-01 09:00:03 5.0
#   2013-01-01 09:00:04 7.0
#   2013-01-01 09:00:06 5.0
# Name: num, dtype: float64

由于使用了groupby操作,最终结果将呈现为MultiIndex格式。若希望在DataFrame中以常规格式查看结果,可调用reset_index()方法进行转换。

以上关于pandas中时间窗函数rolling的使用详解即为全部内容,希望能为读者提供参考,并感谢大家的支持。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表