如何用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
相关产品推荐
相关产品推荐

