Сопоставление фреймов данных Pandas с условием дельта-дней даты и времени

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

У меня есть следующие два фрейма данных:

печать (df)

           perid     completion_date  store_banner
0       15001703     2020-09-16           0
1       1000190      2020-07-21           2
...
 

печать (df1)

          perid      status    substatus  sample_date
0      15001703       4            3    2020-09-20
1      15024030       5            2    2020-11-05

...
 

Я хотел бы объединить эти два фрейма, чтобы столбцы из df1 добавлялись в df (левое слияние), если коды perid совпадают, а разница в днях между sample_date и completion_date меньше или равна 14 дням.

В псевдокоде:

  • (df.perid == df1.perid) amp; ( (df1.sample_date — df.completion_date) <= 14 дней)

Таким образом, получение (в случае приведенного выше примера):

печать (final_df)

           perid     completion_date  store_banner      status    substatus  sample_date
0       15001703     2020-09-16           0              4           3      2020-09-20
 

Как я могу этого добиться?

Ответ №1:

Использование DataFrame.merge с фильтром вычитаемых столбцов, преобразованных в дни по Series.dt.days :

 df1['completion_date'] = pd.to_datetime(df1['completion_date'])
df2['sample_date'] = pd.to_datetime(df2['sample_date'])

df = df1.merge(df2, on='perid')
df = df[(df.sample_date - df.completion_date).dt.days <= 14]

print (df)
      perid completion_date  store_banner  status  substatus sample_date
0  15001703      2020-09-16             0       4          3  2020-09-20
 

Комментарии:

1. Действительно, правильно; Я бы, возможно, подумал о добавлении обоих условий <= 14 amp; >= 0 . Для наглядности дата завершения относится к подписи документа и образцу для теста; следовательно, отрицательное значение будет означать, что я подпишу после выполнения теста.

2. @AlessandroCeccarelli — Затем используйте (df.sample_date - df.completion_date).dt.days.between(0, 14) вместо (df.sample_date - df.completion_date).dt.days <= 14