如何用Pandas计算时间序列中连续两年周期的均值?
嘿,这个需求我之前也碰到过,循环确实不够高效,用Pandas的时间索引和向量化操作就能轻松搞定!
高效计算连续两年周期的均值
首先,确保你的DataFrame已经设置了DatetimeIndex(这是时间序列操作的基础),如果还没做,先完成转换:
# 假设你的日期列名为'date' df['date'] = pd.to_datetime(df['date']) df = df.set_index('date')
接下来,我们可以通过动态生成两年窗口的时间范围,结合Pandas的布尔索引和向量化计算来实现,完全避免低效的循环:
方法一:动态生成两年窗口并计算均值
这种方法会自动适配你的数据年份范围(不需要硬编码2014-2017):
# 获取数据中的最小和最大年份 min_year = df.index.year.min() max_year = df.index.year.max() # 生成所有连续的两年组合(比如2014-2015, 2015-2016...) year_pairs = [(y, y+1) for y in range(min_year, max_year)] # 用列表推导式批量计算每个窗口的均值,再合并结果 two_year_means = pd.concat( [ # 筛选当前两年窗口内的数据,计算均值并命名列 df[(df.index.year >= start) & (df.index.year <= end)].mean().to_frame(name=f"{start}-{end}") for start, end in year_pairs ], axis=1 ).T # 转置让年份对成为索引,更直观
运行后,two_year_means会是一个新的DataFrame:
- 索引是两年周期的标识(比如"2014-2015")
- 列是原DataFrame的各个数值列
- 值对应每个两年窗口内所有行的均值
额外验证小技巧
如果你想验证结果准确性,可以单独计算某一个窗口的均值对比:
# 验证2014-2015的均值 df[(df.index.year >=2014) & (df.index.year <=2015)].mean()
这个结果和two_year_means.loc['2014-2015']应该完全一致。
这种方法的优势是利用了Pandas的向量化操作,比循环快得多,尤其是当数据量变大时效果更明显。
内容的提问来源于stack exchange,提问作者JCM
相关产品推荐
相关产品推荐

