Функция согласования диапазона дат панды - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть фрейм данных с именем df1, который выглядит следующим образом:

  Loc    Start      End 
  CA     2013-11-08 2014-04-14
  CO     2014-04-14 2014-04-16
  CA     2014-04-16 2014-04-18
  CO     2014-04-18 2014-04-23

И у меня есть еще один фрейм данных с именем df2, который выглядит следующим образом:

Date       Loc Flag
2014-04-14  CO   0
2014-04-14  CO   0
2014-04-14  CO   0
2014-04-15  CO   0
2014-04-15  CO   0
2014-04-16  CO   0
2014-04-16  CO   0
2014-04-16  VA   0
2014-04-16  CA   0

Я хочучтобы построить функцию так, чтобы для каждого периода Start и End в df1 функция проверяла, соответствуют ли строки в df2, которые попадают в этот диапазон дат, то есть совпадения loc.Там, где они не совпадают, я хочу, чтобы Flag был помечен 1. Вот код, который я пробовал:

for i in range(len(df1)):
    for j in range(len(df2)):
        if df2['Date'][j] <= df1['End Date'][i] and \
        df2['Date'][j] >= df1['Start Date'][i]: 
            if df2['Loc'][j] != df1['Loc'][i]:
                df2['flag'][j] = 1

Мой код помещает 1 в те места, где места действительно совпадают.Я думаю, что это из-за перекрывающихся дат Start и End.Любые советы о том, как я могу исправить это?Спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

Гораздо более простым решением является использование merge_asof.Это похоже на левое соединение, за исключением того, что мы сопоставляем ближайший ключ, а не равный ключ.Вот еще: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge_asof.html

df1['interval'] = pd.to_datetime(df1['start_date'])
df2['interval'] = pd.to_datetime(df2['Date'])

df1.sort_values(by=['interval'])
df2.sort_values(by=['interval'])

df3 = pd.merge_asof(df2, df1, on='interval', by='Loc')
...