【问题标题】:Pandas: Merge two dataframes with timedeltaPandas:使用 timedelta 合并两个数据帧
【发布时间】:2022-11-25 10:13:11
【问题描述】:

我正在尝试对两个具有“ID”和“日期”列的大型数据帧执行内部合并。每个示例如下所示:

df1

    ID      Date
0   RHD78   2022-08-05
1   RHD78   2022-08-06
2   RHD78   2022-08-09
3   RHD78   2022-08-11
4   RHD78   2022-08-12
5   RHD78   2022-08-14
6   RHD78   2022-08-15
7   RHD78   2022-08-19
8   BDW56   2022-03-15
9   BDW56   2022-03-16
10  BDW56   2022-03-17
11  BDW56   2022-03-22
12  BDW56   2022-03-23
13  BDW56   2022-03-27
14  BDW56   2022-03-29
15  BDW56   2022-03-30

df2

    ID      Date
0   RHD78   2022-08-12
1   BDW56   2022-03-23

如果我使用代码 df_result = pd.merge(df1, df2, how = 'inner', on='Date'),那么我会得到两个相交的数据点。但是,我正在努力引入一个 timedelta,以便生成的数据帧还包括相交日期前后 4 天的数据,如下所示:

df_desired

    ID      Date
0   RHD78   8/9/2022
1   RHD78   8/11/2022
2   RHD78   8/12/2022
3   RHD78   8/14/2022
4   RHD78   8/15/2022
5   BDW56   3/22/2022
6   BDW56   3/23/2022
7   BDW56   3/27/2022

我试图研究使用 merge_asof() 函数,但我的理解是它只获取最接近日期且不在特定日期范围内的值。我正在学习 pandas 和 python,所以如果有人能帮助我解决这个问题并提供 merge_asof() 的简化解释,我将不胜感激。

【问题讨论】:

    标签: python python-3.x pandas dataframe merge


    【解决方案1】:

    使用 df 作为您的第一个数据框,使用 df2 作为第二个数据框,我遵循与 this answer 中相同的程序,即将它们交叉合并在一起,然后在合并发生后进行过滤。交叉合并只是一揽子合并,它将每个数据帧中的每一行对组合在一起。如果您的两个数据框非常大,这可能不适用。

    merge = df2.merge(df,how='cross')
    merge['timedelta'] = pd.to_datetime(merge['Date_x']) - 
                         pd.to_datetime(merge['Date_y'])
    merge_filt = merge.loc[merge['timedelta'].apply(lambda x: x.days).abs()<=4]
    
    
    print(merge_filt)
    Out[43]: 
         ID_x      Date_x   ID_y      Date_y timedelta
    2   RHD78  2022-08-12  RHD78  2022-08-09    3 days
    3   RHD78  2022-08-12  RHD78  2022-08-11    1 days
    4   RHD78  2022-08-12  RHD78  2022-08-12    0 days
    5   RHD78  2022-08-12  RHD78  2022-08-14   -2 days
    6   RHD78  2022-08-12  RHD78  2022-08-15   -3 days
    27  BDW56  2022-03-23  BDW56  2022-03-22    1 days
    28  BDW56  2022-03-23  BDW56  2022-03-23    0 days
    29  BDW56  2022-03-23  BDW56  2022-03-27   -4 days
    

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 2020-04-07
      • 2016-03-02
      • 2017-12-17
      • 2022-07-20
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多