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

如何在Pandas中对FRED月度数据分组求和时过滤非完整年份?

解决FRED月度数据转年度求和时排除数据不全年份的问题

你的问题核心在于当前代码只完成了年度分组求和,但没有先筛选出每个年份包含12个完整月度观测的组。2019年被错误包含,说明它的月度观测数不足12条,但原代码没做过滤就直接求和了。

下面提供两种高效的解决方案:

方法一:先过滤完整年份,再求和

这种方式逻辑直观,先把数据不全的年份全部剔除,再进行求和计算:

import pandas_datareader.data as web

mnemonic = 'RSFSXMV'
df = web.DataReader(mnemonic, 'fred', 2000, 2020)
df['year'] = df.index.year

# 筛选出每个年份有12条月度记录的行
filtered_df = df.groupby('year').filter(lambda x: len(x) == 12)
# 对过滤后的完整年份进行求和
new_df = filtered_df.groupby('year')[mnemonic].sum().reset_index()

print(new_df)

方法二:一次分组完成计数+求和,再过滤

这种方式只需要一次分组操作,效率更高,适合处理大规模数据:

import pandas_datareader.data as web

mnemonic = 'RSFSXMV'
df = web.DataReader(mnemonic, 'fred', 2000, 2020)
df['year'] = df.index.year

# 分组后同时计算年度总和与月度观测数
grouped_stats = df.groupby('year').agg(
    annual_total=(mnemonic, 'sum'),
    monthly_count=(mnemonic, 'count')
).reset_index()

# 只保留观测数为12的完整年份,并重命名列名匹配原格式
new_df = grouped_stats[grouped_stats['monthly_count'] == 12][['year', 'annual_total']].rename(columns={'annual_total': mnemonic})

print(new_df)

关键逻辑说明:

  • groupby.filter() 会根据lambda表达式的结果(len(x) == 12)保留所有符合条件的组的行,确保后续求和只针对数据完整的年份。
  • 第二种方法用agg()一次性计算求和与计数,避免重复分组,最后通过过滤monthly_count == 12得到目标结果,性能更优。

修改后,2019年如果月度观测数不足12,就会被自动排除在最终结果里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:27:00