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

如何用pd.merge合并带滞后DatetimeIndex的Pandas多索引DataFrame

解决Pandas多索引DataFrame滞后合并的问题

我明白你需要将df2的Attr_2列滞后一个月后,通过pd.merge合并到df1中。核心思路是先调整df2的日期索引,让它的日期向后偏移一个月,这样就能和df1的对应日期匹配上,再执行合并操作。

步骤详解

  1. 确保日期为Datetime类型:首先要把两个DataFrame的日期索引转换为datetime类型,这样才能正确执行日期偏移操作。
  2. 偏移df2的日期索引:将df2的每个日期都往后推一个月,让2010-12-31的数据对应到2011-01-31,正好匹配df1的下一个周期。
  3. 执行左连接合并:使用left连接方式,保留df1的所有行,匹配不到的Attr_2会自动填充为NaN。

完整代码示例

假设你的df1和df2已经是date+ID的多索引结构,我们可以这样处理:

import pandas as pd

# 先将多索引中的date转为datetime类型(如果原本是字符串的话)
df1.index = pd.MultiIndex.from_tuples(
    [(pd.to_datetime(date), id_) for date, id_ in df1.index],
    names=['date', 'ID']
)
df2.index = pd.MultiIndex.from_tuples(
    [(pd.to_datetime(date), id_) for date, id_ in df2.index],
    names=['date', 'ID']
)

# 对df2的日期索引执行月度偏移
new_dates = df2.index.get_level_values('date') + pd.DateOffset(months=1)
# 重新构建df2的多索引,替换为偏移后的日期
df2_lagged = df2.set_index([new_dates, df2.index.get_level_values('ID')])

# 基于多索引执行左连接合并
result = pd.merge(df1, df2_lagged, left_index=True, right_index=True, how='left')

print(result)

输出验证

执行上述代码后,会得到你期望的结果:

Attr_1    Attr_2
date       ID                    
2010-12-31 13       A       NaN
           9        B       NaN
           1        C       NaN
2011-01-31 13       D -0.124409
           9        E  0.555959
           1        F -0.705634

补充说明

  • 如果你的date索引已经是DatetimeIndex类型,可以跳过第一步的类型转换,直接执行日期偏移。
  • 使用pd.DateOffset(months=1)能准确处理月末日期的偏移(比如12/31加一个月自动变为1/31),比pd.Timedelta更适合月度周期的偏移场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:28:23