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

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()

为什么之前的分组不满足需求

  1. 第一种分组仅按单年份+月份聚合,未合并十年区间;
  2. 第二种year//10*10会生成2020/2010这类整十年起始点,和你需要的2012-2021/2002-2011分组逻辑完全不符。

内容的提问来源于stack exchange,提问作者Lena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:10:14