自定义季节重采样时间序列DataFrame并计算聚合均值
自定义季节划分的时间序列年度均值计算问题
数据集背景
我正在处理一个大型时间序列数据集,生成代码如下:
import pandas as pd import numpy as np import random import seaborn as sns df = pd.DataFrame({'date':pd.date_range('1990',end = '1994',freq='3H'), 'A': np.random.randint(low = 0,high=100,size=11689), 'B': np.random.randint(low = 10,high=45,size=11689) }) df['date'] = pd.to_datetime(df.date.astype(str), format='%Y/%m/%d %H:%M',errors ='coerce') df.index = pd.DatetimeIndex(df.date) df.drop('date', axis = 1, inplace = True)
需求说明
需要按照自定义季节划分筛选数据并计算年度均值,季节划分如下:
- 冬季:12月、1月、2月(跨年度,如1990年12月到1991年2月属于1990/1991冬季)
- 预季风季:3月、4月、5月
- 季风季:6月、7月、8月、9月
- 后季风季:10月、11月
我尝试过用resample('Q-NOV')但它只支持固定季度,不符合自定义需求,目前完成了部分筛选:
# 冬季数据筛选 winterStart = '-12' winterEnd = '-02' df_winter = pd.concat([df.loc[str(year) + winterStart : str(year+1) + winterEnd].mean() for year in range(1990, 1994)]) # DJF # 冬季跨年度,所以用当年12月到下一年2月 # 预季风季数据筛选 df_preMonsoon = df[df.index.month.isin([3,4,5])] # MAM
问题
需要计算数据周期内每年每个季节中参数A和B的季节平均值,请求帮助。
解决方案
步骤1:定义季节映射与年度归属规则
先为每个月份分配对应的季节,同时处理冬季的跨年度问题:将12月归属到下一年度的冬季(比如1990年12月属于1991年度的冬季),统一按年度分组计算。
# 定义月份到季节的映射 season_mapping = { 1: '冬季', 2: '冬季', 3: '预季风季', 4: '预季风季', 5: '预季风季', 6: '季风季', 7: '季风季', 8: '季风季', 9: '季风季', 10: '后季风季', 11: '后季风季', 12: '冬季' # 12月归到下一年的冬季 } # 创建年份和季节列 df['year'] = df.index.year df['month'] = df.index.month # 处理冬季的年度归属:12月的年份加1 df.loc[df['month'] == 12, 'year'] += 1 # 映射季节 df['season'] = df['month'].map(season_mapping)
步骤2:分组计算年度季节均值
使用groupby按year和season分组,直接计算A和B的均值:
# 计算年度季节均值 seasonal_yearly_mean = df.groupby(['year', 'season'])[['A', 'B']].mean().reset_index() # 按自定义季节顺序排序,让结果更直观 season_order = ['冬季', '预季风季', '季风季', '后季风季'] seasonal_yearly_mean['season'] = pd.Categorical(seasonal_yearly_mean['season'], categories=season_order, ordered=True) seasonal_yearly_mean = seasonal_yearly_mean.sort_values(['year', 'season'])
步骤3:查看结果
打印或查看最终结果:
print(seasonal_yearly_mean)
结果说明
最终的seasonal_yearly_mean会包含每一年每个季节的A和B的平均值,示例格式如下:
| year | season | A | B |
|---|---|---|---|
| 1991 | 冬季 | 49.2345 | 27.1234 |
| 1991 | 预季风季 | 50.1123 | 26.8765 |
| ... | ... | ... | ... |
内容的提问来源于stack exchange,提问作者Peshal1067
相关产品推荐
相关产品推荐

