按3列和日期范围合并2个数据框

时间:2019-01-11 13:55:55

标签: pandas date merge

我有两个要合并的数据框,其中一个有产品销售量

    product   quantity   client   date       door
0   81007104  30         0        2014-01-05   40
1   81007104  41         1        2014-07-05   44

还有我要销售的合同中的另一个数据框,所以

   product    client    door    valid_from  valid_until  contract_num 
0  81007104   71        6       2013-02-01  2014-02-01   25470
1  81007104   71        6       2014-05-01  2014-11-01   25944

所以我想使用产品,客户,门和日期之间在有效期至有效期之间的范围内的两个数据框进行合并。

我认为没有约会的日期

pd.merge(df1, df2, how='left', on=['product','client','door'])

但是由于我希望日期介于有效日期和有效日期之间,因此之前的合并无效。

通过上一次合并,我得到了

    product     quantity    date        client  door    valid from  valid until 
0   81007104    44.0        2014-03-05  71      6       2013-02-01  2014-02-01
1   81007104    44.0        2014-03-05  71      6       2014-05-01  2014-11-01  
2   81007104    44.0        2014-03-05  71      6       2014-11-02  2015-07-20

但是日期不在valid_from和valid_until之间,因为我想要的日期应该在valid_from和valid_until范围内

    product     quantity    date        client  door    valid from  valid until 
0   81007104    44.0        2014-01-05  71      6       2013-02-01  2014-02-01
1   81007104    44.0        2014-07-02  71      6       2014-05-01  2014-11-01  
2   81007104    44.0        2015-06-01  71      6       2014-11-02  2015-07-20

1 个答案:

答案 0 :(得分:2)

我建议您将日期转换为pd.datetime,如下所示:

#create data
df1 = pd.DataFrame(data = {'product': ['81007104','81007104'], 
                          'quantity': ['30','41'],
                          'client': ['0','1'],
                          'date': ['20140105','20140705'],
                          'door': ['40','44']})  
df2 = pd.DataFrame(data = {'product': ['81007104','81007104'], 
                          'client': ['0','1'],
                          'valid from': ['20140105','20140705'],
                          'valid until': ['20140105','20140705'],
                          'door': ['6','6'],
                          'contact num': ['25470','25944']})
# convert to datetime     
df1.date = pd.to_datetime(df1.date, format='%Y%m%d', errors='ignore')
df2['valid from'] = pd.to_datetime(df2['valid from'], format='%Y%m%d', errors='ignore')
df2['valid until'] = pd.to_datetime(df2['valid until'], format='%Y%m%d', errors='ignore')

然后合并表以找到所需的常用功能(也许是内部联接是您要寻找的,而不是剩下的。从您的描述中我无法理解),然后可以根据日期过滤数据框,这在转换后很容易到pd.datetime。