按两个日期时间之间的日期匹配两个数据框

时间:2019-04-06 16:16:23

标签: python pandas dataframe

数据

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年1月2日。在df1中有两个名为Apple的项目,但是2002-01-02在2001-05-03和2002-08-09之间。因此,我们知道经理在df2中应该是Apple的A。

df2中的香蕉项目于2003-05-13开始。由于df1中没有香蕉项目的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之间找到管理员。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分: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

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