如何对跨多年的pandas DataFrame按跨年12-2月组重采样?
解决跨年度季节重采样的Pandas惯用方法
你的需求核心是将跨年度的冬季(上年12月-当年2月)作为一个年度周期分组,同时保证第一个分组完全包含前三个索引对应的行,这确实不能用默认的resample('Y')(它会按自然年份切割)。下面是符合Pandas惯用风格且高效的实现方案:
核心思路
我们需要给每个日期分配一个季节年度标签:
- 12月的日期,将其年份加1(比如1881-12属于1882年的冬季组)
- 1月和2月的日期,保持原年份(比如1882-01、1882-02都属于1882年的冬季组)
用这个标签作为分组键,通过groupby完成重采样计算,既高效又符合Pandas的向量化操作逻辑。
代码实现
1. 生成季节年度分组键
推荐用NumPy的向量化操作(比apply循环快得多):
import numpy as np import pandas as pd # 假设你的DataFrame是df,索引为DatetimeIndex season_year = np.where(df.index.month == 12, df.index.year + 1, df.index.year)
2. 分组计算均值(自动忽略NaN)
resampled_df = df.groupby(season_year).mean()
验证断言
这个方案完全满足你的断言要求:
# 用equals避免浮点数精度问题导致的断言失败 assert df.iloc[0:3].mean().equals(resampled_df.iloc[0])
第一个分组resampled_df.iloc[0]对应的就是1882年冬季组,包含1881-12-01、1882-01-01、1882-02-01三个行,均值完全匹配。
为什么这个方法更优?
- 效率更高:基于Pandas/NumPy的向量化操作,比自定义分区函数的循环处理快几个数量级,尤其适合大数据集
- 逻辑清晰:直接通过日期属性生成分组键,可读性强,易于维护
- 原生支持NaN处理:
groupby.mean()默认会忽略NaN值,无需额外处理 - 完全匹配需求:完美解决了跨年度分组的问题,同时保证第一个分组的范围符合预期
内容的提问来源于stack exchange,提问作者heyarne
相关产品推荐
相关产品推荐

