【问题标题】:Merge 2 dataframes by 3 columns and range of a date按 3 列和日期范围合并 2 个数据框
【发布时间】:2019-06-06 10:59:39
【问题描述】:

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

    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'])

但由于我希望日期介于 valid_from 和 valid_until 之间,因此之前的合并不起作用。

通过之前的合并,我得到了

    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

【问题讨论】:

    标签: pandas date merge


    【解决方案1】:

    我建议你将日期转换为 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。

    【讨论】:

    • 感谢您的帮助,我编辑了问题以提供几个示例。主要问题是现在我没有完成日期在valid_from和valid_until之间的数据框。我将它们转换为日期时间,但是当我对问题进行编辑时,日期不在范围之间。
    • @set92 合并后,您需要执行类似df[df.date.between(df['valid from'], df['valid until'])] 之类的操作,它将仅对日期介于范围之间的行进行子集化。
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2018-11-14
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多