Как объединить DF по дате, используя только день и месяц, используя указанный диапазон дат

У меня есть DF (df0) с диапазоном дат:

date
12/30/2018
12/31/2018
1/1/2019
1/2/2019
1/3/2019

И DF (df1) с данными:

date        loc temp
12/30/2017  YYC 5.07
12/31/2017  YYC 5.64
1/1/2017    YYC 3.43
1/2/2017    YYC 7.89
1/3/2017    YYC 2.49
12/30/2017  YYZ 4.08
12/31/2017  YYZ 7.40
1/1/2017    YYZ 7.82
1/2/2017    YYZ 8.33
1/3/2017    YYZ 7.74

Я хотел бы создать новый df, объединив информацию в df1 с диапазоном дат в df0, используя только день и месяц в df1. Не имеет значения, если годы не совпадают. IE: 30.12.2018 будет брать данные от 30.12.2017 в df1.

Диапазон дат в df0 - это ключевой диапазон дат, который я хотел бы сохранить.

Для каждого дня календарного года существует только одно временное значение для каждого местоположения. Это же значение может появляться несколько раз, если df0 охватывает несколько лет. IE: если бы df0 был десятилетним временным рядом, я бы увидел YYC = 5.07 десять раз, на каждые 12/30 временного ряда.

В приведенном выше примере df0 и df1 новый фрейм данных (df2) будет иметь две записи от 30.12.2018:

date        loc temp
12/30/2018  YYC 5.07
12/30/2018  YYZ 4.08

Я не верю, что смогу объединить их, так как это актуально. Я не верю, что смогу сделать .isin df0, так как мне нужно сопоставить только часть (день и месяц)


person thesimplevoodoo    schedule 20.03.2018    source источник
comment
Ваш вывод кажется неправильным. date из df1, но значения взяты из df0, в котором есть столбец Date   -  person ALollz    schedule 20.03.2018
comment
Я редактировал пост - дата написана с заглавной буквы по ошибке. Вы правы, я хочу сохранить даты в df0.   -  person thesimplevoodoo    schedule 20.03.2018


Ответы (1)


Для каждого фрейма данных создайте столбец месяца и дня, а затем объедините df1 с df0:

import pandas as pd

df0['Date'] = pd.to_datetime(df0['Date'])
df1['date'] = pd.to_datetime(df1['date'])
df0['day'] = df0.Date.dt.day
df0['month'] = df0.Date.dt.month
df1['day'] = df1.date.dt.day
df1['month'] = df1.date.dt.month

df0.merge(df1, how='inner', on=['month', 'day']).drop(columns=['month', 'day', 'date'])

    Date    loc temp
0   2018-12-30  YYC 5.07
1   2018-12-30  YYZ 4.08
2   2018-12-31  YYC 5.64
3   2018-12-31  YYZ 7.4
4   2019-01-01  YYC 3.43
5   2019-01-01  YYZ 7.82
6   2019-01-02  YYC 7.89
7   2019-01-02  YYZ 8.33
8   2019-01-03  YYC 2.49
9   2019-01-03  YYZ 7.74
person ALollz    schedule 20.03.2018
comment
Спасибо за этот ответ. Я думал, что могут потребоваться помощники, но надеялся, что есть другой вариант. Для .drop(columns=) я получаю сообщение об ошибке .drop () получил неожиданный аргумент ключевого слова "столбцы". Я переключился на .drop(['month','day'],1), и он, похоже, работает нормально. Вы знаете, происходит ли это изменение синтаксиса между версиями? - person thesimplevoodoo; 20.03.2018
comment
Также один вопрос - я видел ваш комментарий выше о дате / дате и изменил так, чтобы эти заголовки совпадали. После слияния получается два столбца даты: date_x и date_y. Есть какие-нибудь советы по выбору правильной даты? Я подумал о том, чтобы сбросить его, пока готовил вспомогательные колонны. Или можно сбросить его напрямую через букву date_correct, но я не был уверен в правилах автоматического именования панд. - person thesimplevoodoo; 20.03.2018
comment
поэтому вы получите date_x и date_y, когда оба DataFrames имеют столбец с тем же именем, которого нет в ключе слияния. Таким образом вы сможете определить, из какого DataFrame были взяты эти переменные. Я бы посоветовал просто оставить одну с именем Date, а другую с именем date, чтобы в конце вы могли просто отбросить то, что вам не нужно, не беспокоясь о переименовании. - person ALollz; 20.03.2018
comment
и да, похоже, что аргумент columns был добавлен в 0.21.0. - person ALollz; 20.03.2018