Pandas如何计算精确3个月时间窗口的滚动中位数
实现方案
Pandas的rolling方法本身支持传入时间偏移量作为窗口参数,可以自动适配自然月的天数差异,同时保留每日的计算结果,适配你的需求。
前置要求
确保你的DataFrame的索引为datetime64类型(你的示例数据已经满足该条件)。
核心代码
import pandas as pd # 若索引不是 datetime 类型先执行转换 df.index = pd.to_datetime(df.index) # 计算3个月滚动中位数 df['ODPLYW_3M_median'] = df['ODPLYW'].rolling( window = pd.DateOffset(months=3), min_periods = 1 # 可自行调整最少需要的样本数,例如要求至少满2个月数据可改为60 ).median()
方案说明
- 自动适配不同月份的天数差异:
pd.DateOffset(months=3)会自动根据当前日期计算前推3个自然月的窗口范围,比如11月1日对应的窗口是8月1日到11月1日,不受2月、大小月天数差异影响,比固定90天窗口更准确。 - 每日输出对应结果:滚动计算逻辑会逐行生成每个日期对应的3个月窗口中位数,和原数据行数完全对齐,不会出现仅每3个月输出一个值的问题。
兼容低版本Pandas的备选方案
如果你的Pandas版本低于1.3,不支持直接传入DateOffset作为滚动窗口,可以用自定义apply实现,适合数据量不大的场景:
def calc_3m_median(current_date): start_date = current_date - pd.DateOffset(months=3) return df.loc[start_date:current_date, 'ODPLYW'].median() df['ODPLYW_3M_median'] = df.index.to_series().apply(calc_3m_median)
内容的提问来源于stack exchange,提问作者Bartek Blatkiewicz
相关产品推荐
相关产品推荐

