You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于2个日历月滚动窗口计算DataFrame的均值与标准差

基于日历月的滚动均值与标准差计算

原始数据生成代码

import pandas as pd

data = {'A': list(range(250)), 'B': list(range(251,501))}
dates = pd.date_range('2023-01-17', periods=250, freq='D')
df = pd.DataFrame(data, index=dates)

需求说明

  • 计算基于2个日历月的滚动均值,预期输出格式如下:
A      B
2023-02-28    21.0  272.0
2023-03-31    44.0  295.0
2023-04-30    73.0  324.0
…
2023-08-31   222.5  473.5
  • 同时计算基于2个日历月的滚动标准差,预期输出格式如下:
A        B
2023-02-28   12.556   12.556
2023-03-31   17.175   17.175
2023-04-30   17.175   17.175
…
2023-08-31   15.732   15.732
  • 需支持DataFrame任意列存在NaN值的情况

解决方案

计算滚动均值

使用rolling指定时间窗口为2个日历月,再提取每个月末的计算结果:

# 计算2个日历月滚动均值,仅保留月末数据
rolling_mean = df.rolling(window='2M', closed='right').mean().resample('M').last()

计算滚动标准差

同理,替换为std()方法计算标准差:

# 计算2个日历月滚动标准差,仅保留月末数据
rolling_std = df.rolling(window='2M', closed='right').std().resample('M').last()

参数说明

  • window='2M':指定滚动窗口的时间跨度为2个日历月,自动适配不同月份的天数差异
  • closed='right':窗口包含当前日期,即计算到当前日期为止的过去2个月内所有数据的统计量
  • resample('M').last():筛选出每个月最后一天的计算结果,匹配预期输出的格式
  • NaN处理:默认skipna=True,计算时会自动忽略列中的NaN值;若需要保留NaN(即窗口内存在NaN时结果为NaN),可在mean()/std()中设置skipna=False

验证示例结果

以2023-02-28的均值为例:

  • 窗口覆盖2023-12-28至2023-02-28,但原始数据从2023-01-17开始,实际计算范围为2023-01-17至2023-02-28
  • A列数值为0~42,均值为(0+42)/2=21.0,与示例完全匹配

内容的提问来源于stack exchange,提问作者Gerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:15:59