如何用Pandas将月度数据合并至日度数据并保留日度索引
嘿,这需求我熟!要把月度贸易余额数据「扩展」到对应月份的每一天,和日度股价合并成完整的数据集,用Python的pandas几步就能搞定,我给你写详细的步骤和代码,包你能用~
解决方案步骤
1. 导入工具并读取数据
首先导入pandas,然后分别读取两个CSV文件,记得把日期列设置为索引,方便后续处理:
import pandas as pd # 读取日度股价数据,自动解析日期索引 df_daily = pd.read_csv('A.csv', index_col=0, parse_dates=True) # 读取月度贸易余额数据,同样解析日期索引 df_monthly = pd.read_csv('B.csv', index_col=0, parse_dates=True)
2. 让月度数据和日度数据「对齐」
核心思路是:给日度数据标记它所属的年月,然后把对应年月的月度贸易余额赋值给每一天。我们可以用to_period('M')来提取年月信息:
# 给月度数据添加年月标识(比如"1980-01") df_monthly['year_month'] = df_monthly.index.to_period('M').astype(str) # 给日度数据也添加对应的年月标识 df_daily['year_month'] = df_daily.index.to_period('M').astype(str)
3. 映射月度数据到日度行
用map方法把月度的贸易余额值映射到日度数据的每一行,然后删掉临时的年月列:
# 把月度贸易余额映射到日度数据的对应行 df_daily['月度贸易余额'] = df_daily['year_month'].map(df_monthly.set_index('year_month')['月度贸易余额']) # 移除临时的年月辅助列 df_daily.drop('year_month', axis=1, inplace=True)
4. 验证并保存结果
你可以随便挑某一个月份的数据看看,比如df_daily.loc['1980-01'],检查这个月的所有行是不是都有相同的「月度贸易余额」值。确认没问题后,就可以保存成新的CSV了:
# 保存最终的日度数据集 df_daily.to_csv('merged_daily_data.csv')
另一种更简洁的方法:用merge_asof
如果你不想手动处理年月列,也可以用pandas的merge_asof函数,它会自动匹配最近的不晚于日度日期的月度数据:
# 把月度数据的索引转换为当月第一天的时间戳 df_monthly.index = df_monthly.index.to_period('M').to_timestamp() # 执行合并,direction='backward'确保匹配当前日期所在月份的月度数据 df_merged = pd.merge_asof(df_daily, df_monthly, left_index=True, right_index=True, direction='backward') # 保存结果 df_merged.to_csv('merged_daily_data.csv')
两种方法都能达到你的需求,选哪个看你习惯~
内容的提问来源于stack exchange,提问作者user9505772




