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

如何对跨多年的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:54