如何在Pandas DataFrame中计算冬月(12/1/2月)的目标平均值?
解决跨年度冬季(12/1/2月)数据的平均值计算问题
我明白你的问题了——你要计算的是**跨年度冬季(前一年12月 + 当年1、2月)**的平均值,但默认的年度重采样(resample('a'))是按自然日历年度(1月到12月)聚合,所以会把同一年里的1、2月和当年12月混在一起,这显然不符合你的需求。下面是具体的解决方案:
步骤1:还原你的数据(方便复现)
首先我们先构造你提供的DataFrame:
import pandas as pd # 构造数据 data = { 'date': ['2000-02-29', '2000-03-31', '2000-04-30', '2000-05-31', '2000-06-30', '2000-07-31', '2000-08-31', '2000-09-30', '2000-10-31', '2000-11-30', '2000-12-31', '2001-01-31', '2001-02-28', '2001-03-31', '2001-04-30', '2001-05-31', '2001-06-30', '2001-07-31', '2001-08-31', '2001-09-30', '2001-10-31', '2001-11-30', '2001-12-31', '2002-01-31', '2002-02-28', '2002-03-31', '2002-04-30'], 'value': [0.046871, None, None, None, None, None, None, None, None, None, 0.015948, 0.020552, 0.033409, None, None, None, None, None, None, None, None, None, 0.013204, 0.017093, 0.019723, None, None] } # 转换为datetime索引的DataFrame df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date']) df = df.set_index('date')
步骤2:添加冬季年度标识
核心思路是给每个冬季月份分配一个跨年度的冬季年份:
- 1月、2月属于当前日历年份的冬季
- 12月属于下一个日历年份的冬季
这样就能把前一年12月和当年1、2月归到同一个冬季组里:
# 创建冬季年份列 df['winter_year'] = df.index.year # 把12月的冬季年份加1,归到下一年的冬季组 df.loc[df.index.month == 12, 'winter_year'] += 1
步骤3:筛选冬季数据并计算平均值
先过滤出只有12、1、2月的有效数据,再按冬季年份分组求平均:
# 筛选冬季月份(1、2、12月)且值不为NaN的行 winter_data = df[(df.index.month.isin([1, 2, 12])) & df['value'].notna()] # 按冬季年份分组计算平均值 winter_average = winter_data.groupby('winter_year')['value'].mean()
最终结果
运行上述代码后,你会得到符合需求的冬季平均值:
print(winter_average) # 输出: # winter_year # 2000 0.046871 # 2001 0.023303 # 2002 0.016673 # Name: value, dtype: float64
- 2000冬季:仅包含2000年2月的数据(无1999年12月数据)
- 2001冬季:2000年12月 + 2001年1月 + 2001年2月的平均值
- 2002冬季:2001年12月 + 2002年1月 + 2002年2月的平均值
内容的提问来源于stack exchange,提问作者bikuser
相关产品推荐
相关产品推荐

