Объединение двух фреймов данных (наборов данных) в столбце с указанным идентификатором c, но с условием даты - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть два набора данных:

  1. Один содержит сертификаты энергии дома, выданные за последние 10 лет, с идентификатором дома и датой его выдачи. В одном доме может быть выдано больше сертификатов, поскольку они могут продлить его.

  2. Другой содержит все транзакции домов за последние 10 лет и идентификатор (который является таким же идентификатором, что и в первом наборе данных)

Моя проблема заключается в том, чтобы найти значение энергетического сертификата дома на дату его продажи. Я могу объединить наборы данных по идентификатору дома, но не совсем уверен, что имею дело со столбцом даты.

Сертификаты энергии содержат столбец с «DateIssued», а набор данных транзакций имеет столбец «OfficialDateSold». ». Тогда условия заключаются в том, чтобы найти энергетический сертификат с правильным идентификатором дома, а затем с датой, ближайшей к дате продажи, но не после.

Фрагмент данных:

Transactions:

         address_id sold_date
0        1223632151           NaN
1         160073875    2013-09-24
2         160073875    2010-06-16
3         160073875    2009-08-05
4         160073875    2006-12-18
...             ...           ...
2792726  2147477357    2011-11-03
2792727  2147477357    2014-02-26
2792728  2147477579    2017-05-24
2792729  2147479054    2013-02-04
2792730  2147482539    1993-08-10

Energy Certificate

                id   certificate_number      date_issued
0       1785963944   A2012-274656  27.11.2012 10:32:35
1        512265039     A2010-6435  30.06.2010 13:19:18
2       2003824679   A2014-459214  17.06.2014 11:00:47
3       1902877247   A2011-133593  14.10.2011 12:57:08
4       1620713314      A2009-266  25.12.2009 13:18:32
...            ...            ...                  ...
307846   753123775  A2019-1078357  30.11.2019 17:23:59
307847  1927124560  A2019-1078363  30.11.2019 20:44:22
307848  1122610963  A2019-1078371  30.11.2019 22:44:45
307849    28668673  A2019-1078373  30.11.2019 22:56:23
307850  1100393780  A2019-1078377  30.11.2019 23:38:42

Требуется вывод

 id                certificate_number      date_issued    sold_date
 id = address_id

 date_issued <= sold_date 

Но также найти сертификат, ближайший к sold_date (самый новый до продажи) (I знаю, что даты должны быть в одном и том же формате)

Я использую Python с Jupyter Notebook.

1 Ответ

1 голос
/ 27 февраля 2020

Я думаю, вам нужно merge_asof, но сначала необходимо преобразовать столбцы в datetimes s на to_datetime и удалить строки с пропущенными значениями в sold_date на DataFrame.dropna:

df1['sold_date'] = pd.to_datetime(df1['sold_date'])
df2['date_issued'] = pd.to_datetime(df2['date_issued'], dayfirst=True)
df1 = df1.dropna(subset=['sold_date'])


df = pd.merge_asof(df2.sort_values('date_issued'), 
                   df1.sort_values('sold_date'), 
                   left_on='date_issued',
                   right_on='sold_date',
                   left_by='id',
                   right_by='address_id')
...