【问题标题】:Match two dataframes by dates between two datetimes按两个日期时间之间的日期匹配两个数据帧
【发布时间】:2019-04-06 16:16:23
【问题描述】:

数据

df1 有项目名称、经理姓名以及每个项目的开始和结束日期。开始日期可能有缺失值,但 supp_date 始终是一个近似值。

project  manager    start_date    end_date      supp_date
Apple    A          2001-05-03    2002-08-09    2002-05-10
Apple    B          2002-10-03    2003-11-12    2002-10-09
Orange   D          nan           2002-10-21    2002-06-25
Banana   C          nan           2003-01-02    2002-11-03
Banana   D          nan           2003-12-15    2003-02-12
Peach    C          2003-07-21    2003-10-12    2003-07-23

df2 只有日期和项目名称:

project    begin_date
Apple      2002-01-02
Banana     2003-05-13

想法

对于 df2 中的每个项目,我想找出它的经理。由于同一个项目在不同时期有不同的经理,我可以使用日期。例如,df2 中的 Apple 项目于 2002-01-02 开始。 df1 中有两个名为 Apple 的项目,但 2002-01-02 在 2001-05-03 和 2002-08-09 之间。所以我们知道经理在 df2 中应该是 Apple 的 A。

df2 中的 Banana 项目于 2003 年 5 月 13 日开始。由于 df1 中没有 Banana 项目的 start_date,因此我们使用 supp_date 作为 start_date。所以 2003-05-13 介于 2003-02-12 和 2003-12-15 之间,我们知道经理是 D。

结果

project    begin_date    manager
Apple      2002-01-02    A
Banana     2003-05-13    D

有没有什么快速的方法可以做到以下几点? df2 真的很大(约 100 万行),所以我认为循环会很慢......

1) 对于df2中的每个项目,检查df1中哪个项目同名

2) 基于 1),如果 start_date 不缺失,则使用 start_date。否则,使用 supp_date

3) 如果 begin_date 在 start_date 和 end_date 之间,或者如果 start_date 缺失,则在 supp_date 和 end_date 之间查找经理。

非常感谢您的帮助!!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我建议使用mergebetween(假设 df2 不会有具有不同 begin_date 的重复项目):

    # merge on project
    merge = df.merge(df2, on='project')
    
    # fill missing start_date with supp_date
    merge['start_date'] = merge['start_date'].fillna(merge['supp_date'])
    
    # boolean indexing with between
    merge[merge['begin_date'].between(merge['start_date'], merge['end_date'])]
    
      project manager start_date   end_date  supp_date begin_date
    0   Apple       A 2001-05-03 2002-08-09 2002-05-10 2002-01-02
    3  Banana       D 2003-02-12 2003-12-15 2003-02-12 2003-05-13
    

    然后您可以删除不需要的列。

    【讨论】:

    • 这太棒了!!非常感谢你让我开始。不幸的是,df2 有许多重复的项目名称......但看起来这应该仍然有效......?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多