Python中对时间序列Pandas Series按月份索引排序并按月分组求年平均
解决Pandas时间序列按年度月度分组求平均的需求
没问题,我来一步步帮你搞定这个需求!咱们先理清楚核心逻辑:先计算每个年度对应月份的平均值(自动忽略NaN),再把相同月份的各年度平均值整合到一起,最后按自然月份顺序排序。
完整代码实现
假设你的Series对象名为s,直接用下面的代码就能得到目标DataFrame:
import pandas as pd # 第一步:确保Series的索引是Datetime类型(如果还不是的话) s.index = pd.to_datetime(s.index) # 第二步:计算每个「年度-月份」的平均值(自动跳过NaN) # 这里用strftime('%b')获取月份的缩写(Jan、Feb...) year_month_avg = s.groupby([s.index.year, s.index.strftime('%b')]).mean() # 第三步:按月份分组,把对应各年度的平均值收集成集合/列表 # 如果你想要集合就把list换成set df_new = year_month_avg.reset_index(level=0).groupby(level=0)[s.name].apply(list).to_frame() # 第四步:按自然月份顺序排序(避免字符串按字母排序的混乱) month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] df_new = df_new.reindex(month_order)
代码解释
- 索引格式校验:先把索引转成
DatetimeIndex,这样才能方便提取年份、月份等时间属性。 - 年度-月份平均值计算:通过
groupby同时按年份和月份缩写分组,用mean()计算每组的平均值(默认会跳过NaN值,完美适配你的数据情况)。 - 整合同月份数据:把年份索引重置为列后,再次按月份分组,用
apply(list)把每个月份下的所有年度平均值打包成列表(换成set就能得到集合)。 - 自然排序:因为字符串默认按字母排序会乱序(比如Apr会在Aug前面),所以我们手动定义月份顺序,用
reindex重新排列索引。
示例验证
如果用示例数据测试:
# 生成示例时间序列(含NaN) dates = pd.date_range('2014-01-01', '2017-12-31', freq='30T') import numpy as np data = np.random.randn(len(dates)) data[::100] = np.nan # 插入部分NaN值 s = pd.Series(data, index=dates, name='temperature')
运行代码后,df_new的索引就是从Jan到Dec的月份缩写,每个行的temperature列就是对应月份2014-2017年的平均值组成的列表。
内容的提问来源于stack exchange,提问作者Chi
相关产品推荐
相关产品推荐

