Pandas按自定义10年周期及月份分组计算均值、标准差并绘图
解决方案
核心思路
你需要的是偏移式10年周期分组(结束于xx21/xx11这类年份,每组覆盖10年),而非常规的整十年分组(如2020-2029)。关键是先为每个年份生成对应的十年组标签,再基于标签完成分组统计与绘图。
步骤1:生成正确的十年分组标签
假设你的df_clean索引是DatetimeIndex,先为每条数据添加十年组标识:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # (如果是自己的真实数据,跳过这行模拟代码) dates = pd.date_range(start='1959-04-01', end='2021-09-30', freq='D') df_clean = pd.DataFrame(np.random.randn(len(dates), 2), index=dates, columns=['col1', 'col2']) # 生成十年分组标签(格式为"起始年-结束年",如2012-2021) def get_decade_label(year): end_year = ((year + 8) // 10) * 10 + 1 start_year = end_year - 9 return f"{start_year}-{end_year}" df_clean['decade_group'] = df_clean.index.year.apply(get_decade_label) # 同时提取月份,用于后续分组 df_clean['month'] = df_clean.index.month
- 逻辑验证:2021→
2012-2021、2012→2012-2021、2011→2002-2011,完全匹配你的需求。
步骤2:分组统计均值与标准差
仅按十年分组
# 十年周期均值 decade_mean = df_clean.groupby('decade_group').mean() # 十年周期标准差 decade_std = df_clean.groupby('decade_group').std()
按十年+月份分组
# 十年+月份均值 decade_month_mean = df_clean.groupby(['decade_group', 'month']).mean() # 十年+月份标准差 decade_month_std = df_clean.groupby(['decade_group', 'month']).std()
步骤3:可视化示例
1. 各十年周期的列均值对比
decade_mean.plot(kind='bar', figsize=(10, 6)) plt.title('Column Means by Decade Group') plt.xlabel('Decade Group') plt.ylabel('Mean Value') plt.grid(axis='y') plt.show()
2. 分十年的月度均值趋势
# 将多级索引展开,方便绘图 decade_month_mean['col1'].unstack(level=0).plot(kind='line', figsize=(12, 6)) plt.title('Col1 Mean by Month & Decade Group') plt.xlabel('Month (4-9)') plt.ylabel('Mean Value') plt.legend(title='Decade Group') plt.grid(True) plt.show()
为什么之前的分组不满足需求
- 第一种分组仅按单年份+月份聚合,未合并十年区间;
- 第二种
year//10*10会生成2020/2010这类整十年起始点,和你需要的2012-2021/2002-2011分组逻辑完全不符。
内容的提问来源于stack exchange,提问作者Lena
相关产品推荐
相关产品推荐

