如何用Pandas为DataFrame补全每月剩余日期并填充首日值?
问题解决:按国家补全每日货币数据并填充首日值
错误原因
你之前的代码报错是因为Date列并非唯一索引——多个国家在同一天(比如2021-01-01)都有数据,将Date设为索引后会出现重复值,而asfreq方法要求索引必须是唯一的时间序列,因此触发了ValueError。
解决方案:按国家分组处理
每个国家的货币数据是独立的时间序列,需按国家分组后分别补全日期,再合并结果。具体实现如下:
代码示例
import pandas as pd # 假设你的原始DataFrame名为df # 按ISO代码分组,每个国家单独处理时间序列 df_daily = df.groupby('ISO_Code', group_keys=False).apply( lambda group: group.set_index('Date').asfreq('D', method='ffill').reset_index() ) # 重置最终索引(可选,根据需求调整) df_daily = df_daily.reset_index(drop=True)
代码说明
groupby('ISO_Code'):按国家唯一标识(ISO代码)分组,确保每个分组对应单个国家的月度数据apply(lambda group: ...):对每个国家的子数据集执行补全操作:set_index('Date'):将当前分组的日期设为索引(此时分组内的日期是唯一的,每个国家每月仅一条首日数据)asfreq('D', method='ffill'):将时间序列补全为每日频率,并用前向填充(ffill)沿用当月首日的数值reset_index():将日期重新转为列,方便后续合并
group_keys=False:避免保留额外的分组键列,让结果结构更简洁
结果验证
处理完成后,每个国家的每个月会从首日补全至当月最后一天,所有新增日期的value列将沿用该月首日数值,Currency_Name、Base_Currency等其他列也会自动填充对应国家的信息。
内容的提问来源于stack exchange,提问作者2837a
相关产品推荐
相关产品推荐

