基于日期列在Pandas合并中添加30天滞后数据的实现方法
问题描述
我当前通过pd.merge基于日期列将小DataFrame(pmms_df)合并到大型DataFrame(df_final)中,代码如下:
df_final = pd.merge(df_final, pmms_df, how='left', on='PredictionDate')
pmms_df的数据结构:
PredictionDate U.S. 30 yr FRM U.S. 15 yr FRM 0 2014-12-31 3.87 3.15 1 2015-01-01 3.87 3.15 2 2015-01-02 3.87 3.15 3 2015-01-03 3.87 3.15 4 2015-01-04 3.87 3.15 ... ... ... ... 2769 2022-07-31 5.30 4.58 2770 2022-08-01 4.99 4.26 2771 2022-08-02 4.99 4.26 2772 2022-08-03 4.99 4.26 2773 2022-08-04 4.99 4.26
df_final是包含20000+行、61列的大型DataFrame,合并后相关列如下:
PredictionDate U.S. 30 yr FRM U.S. 15 yr FRM 0 2022-03-09 3.85 3.09 1 2022-04-11 5.00 4.17 2 2022-05-10 5.30 4.48 3 2022-06-09 5.23 4.38 4 2021-04-09 3.13 2.42 ... ... ... ... 20528 2022-01-11 3.45 2.62 20529 2022-02-09 3.69 2.93 20530 2022-03-09 3.85 3.09 20531 2022-04-11 5.00 4.17 20532 2022-05-10 5.30 4.48
现在需要在df_final中新增30yrLag和15yrLag两列,分别存储PredictionDate提前30天对应的pmms_df中的30年期和15年期FRM数据,期望输出:
PredictionDate U.S. 30 yr FRM U.S. 15 yr FRM 30yrLag 15yrLag 0 2022-03-09 3.85 3.09 3.72 3.12 1 2022-04-11 5.00 4.17 5.05 4.15 2 2022-05-10 5.30 4.48 5.32 4.58 3 2022-06-09 5.23 4.38 . . 4 2021-04-09 3.13 2.42 . . ... ... ... ... 20528 2022-01-11 3.45 2.62 . . 20529 2022-02-09 3.69 2.93 . . 20530 2022-03-09 3.85 3.09 . . 20531 2022-04-11 5.00 4.17 . . 20532 2022-05-10 5.30 4.48 . .
解决方案
1. 统一日期格式
首先确保两个DataFrame的日期列是datetime类型,避免计算错误:
pmms_df['PredictionDate'] = pd.to_datetime(pmms_df['PredictionDate']) df_final['PredictionDate'] = pd.to_datetime(df_final['PredictionDate'])
2. 生成滞后日期并合并数据
在df_final中创建提前30天的日期列,再通过该列与pmms_df匹配获取滞后数据:
# 生成提前30天的临时日期列 df_final['LagDate'] = df_final['PredictionDate'] - pd.Timedelta(days=30) # 重命名pmms_df的列,避免合并后名称冲突 lag_data = pmms_df.rename(columns={ 'PredictionDate': 'LagDate', 'U.S. 30 yr FRM': '30yrLag', 'U.S. 15 yr FRM': '15yrLag' }) # 左连接获取滞后数据,仅保留需要的列 df_final = pd.merge(df_final, lag_data[['LagDate', '30yrLag', '15yrLag']], how='left', on='LagDate') # 可选:删除临时的LagDate列 df_final.drop('LagDate', axis=1, inplace=True)
3. 处理无匹配的情况
如果提前30天的日期在pmms_df中不存在,对应列会显示NaN,可按需替换为指定符号:
df_final[['30yrLag', '15yrLag']] = df_final[['30yrLag', '15yrLag']].fillna('.')
说明
- 左连接保证不会丢失
df_final原有数据; - 重命名列是为了避免与已有的FRM列名称冲突;
- 该方法通过精准匹配日期,确保滞后数据的准确性。
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

