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

如何用Pandas Grouper按自然年代(70、80年代等)分组DataFrame?

解决Pandas按自然年代(70/80/90年代)分组的问题

这个问题我之前也碰到过!Pandas的pd.Grouper(freq='10Y')默认是从数据的起始日期开始计算周期,而不是按自然年代(1970、1980、1990这种整十年分界)来分组,所以才会出现1973-1983这种不符合预期的区间。给你两种简单的解决方案:

方法一:直接提取年代标签(最直观)

通过年份计算出对应的年代(比如1973年属于1970年代,用1970标记),然后按这个标签分组:

import pandas as pd

# 假设你的DataFrame日期是索引(datetime类型)
# 提取年代:年份//10*10 会把1973→1970,1985→1980,以此类推
decades = df.index.year // 10 * 10

# 按年代分组计算均值
decade_mean = df.groupby(decades).mean()

# 可选:把索引改成更友好的格式(比如1970→"1970s")
decade_mean.index = decade_mean.index.map(lambda x: f"{x}s")

方法二:调整pd.Grouper的锚点

利用pd.Grouper的origin参数,把周期的起始点锚定到整十年的第一天(比如1970-01-01),这样10Y的周期就会按自然年代划分:

import pandas as pd

# 锚定到1970年1月1日,让10年周期从整年代开始
decade_mean = df.groupby(
    pd.Grouper(freq='10Y', origin='1970-01-01')
).mean()

# 可选:重命名索引为年代格式
decade_mean.index = decade_mean.index.year.map(lambda x: f"{x}s")

注意事项

  • 如果你的日期不是DataFrame的索引,而是单独的列(比如列名为date),需要在pd.Grouper中指定key参数:
    decade_mean = df.groupby(
        pd.Grouper(key='date', freq='10Y', origin='1970-01-01')
    ).mean()
    
  • 两种方法的结果本质一致:方法一的1970年代包含1973-1979的所有数据,方法二的1970年代组是1973-1980-01-01前的数据,都符合自然年代的分组需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:33:04