Объединить 2 кадра данных по 3 столбцам и диапазону даты - PullRequest
0 голосов
/ 11 января 2019

У меня есть два кадра данных, которые я хочу объединить, в одном я имею продажи продуктов

    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

Итак, я хочу объединить оба фрейма данных, используя столбцы product, client, door и date между диапазоном между действительным и действительным до.

Без даты я думаю, что это будет

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

1 Ответ

0 голосов
/ 11 января 2019

Я предлагаю вам конвертировать даты в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...