Python Pandas:如何将月度不同日期的数据合并为单月行?
解决Pandas中按月合并多发布日期经济指标数据的问题
问题分析
核心需求是将同一月份内多次发布的经济指标数据合并为一行,保留每个指标的最新有效值(避免求和/均值等错误聚合方式),同时处理行内的NaN值。
示例数据准备
基于你提供的示例构建DataFrame:
import pandas as pd data = { 'Dates': ['01.01.20', '08.01.20', '02.02.20', '01.03.20', '31.03.20'], 'Indicator 1': [1, 2, 5, 8, 7], 'Indicator 2': [1, pd.NA, 5, 6, 7] } df = pd.DataFrame(data)
分步解决方案
转换日期并排序
先把日期列转为datetime格式,并按日期排序,确保同一月份内的数据按发布时间先后排列:# 转换日期格式(匹配你的输入格式) df['Dates'] = pd.to_datetime(df['Dates'], format='%d.%m.%y') # 按日期排序,保证后续取最新值的逻辑正确 df = df.sort_values('Dates') # 提取月份周期,作为分组依据 df['Month'] = df['Dates'].dt.to_period('M')按月分组并保留最新有效值
使用分组聚合,对每个指标取分组内最后一个非NaN值(即最新发布的有效数据):# 按月份分组,聚合逻辑:取每个指标的最后一个非空值 result = df.groupby('Month').agg( lambda x: x.dropna().iloc[-1] if not x.dropna().empty else pd.NA ) # 清理结果:去掉原日期列,重置索引 result = result.drop('Dates', axis=1).reset_index()
最终结果
运行后得到的result如下:
| Month | Indicator 1 | Indicator 2 |
|---|---|---|
| 2020-01 | 2 | 1 |
| 2020-02 | 5 | 5 |
| 2020-03 | 7 | 7 |
关键逻辑说明
- 排序保证了同一月份内的数据按发布时间从早到晚排列,最后一个非NaN值就是该指标的最新修正值。
- 聚合时跳过NaN值,避免了将后续发布的NaN覆盖之前的有效值(比如1月8日的Indicator2为NaN,会保留1月1日的1)。
- 完全规避了求和、均值等错误的聚合方式,符合经济指标更新的业务逻辑。
内容的提问来源于stack exchange,提问作者Hinnerk Lührs
相关产品推荐
相关产品推荐

