как я могу получить самую раннюю дату от col2, которая находится в течение 7 дней от col1 с той же категорией? - PullRequest
0 голосов
/ 30 сентября 2018

Я ищу самую раннюю дату в col2, которая находится в пределах 7 дней с даты в col1

df1:

category        date1        date2      
 blue          1/1/2018     
 blue                       1/2/2018
 blue                       1/5/2018
 blue          2/1/2018
 green         1/3/2018     
 green                      1/8/2018
 red           12/1/2018
 red                        11/1/2018
 red                        12/5/2018



Expected results:

category        date1        date2     isDateWithin7Days?      EarliestDate?
 blue          1/1/2018                      True             1/2/2018
 blue          2/1/2018                      False               0
 green         1/3/2018                      False            1/8/2018
 red           12/1/2018                     False            12/5/2018

С большой помощью у меня есть код для возврата ИСТИНА и ЛОЖЬ, если есть даты с 7 днями,Как я понимаю метод .between (), он возвращает только логические значения.

Как я могу вернуть дату?

df['date1'] = pd.to_datetime(df['date1'], format = '%m-%d-%y')
df['date2'] = pd.to_datetime(df['date2'], format = '%m-%d-%y')

df1 = df.dropna(subset = ['date1']).drop(columns = ['date2'])
df2 = df.dropna(subset = ['date2']).drop(columns = ['date1'])

df3 = df1.merge(df2, on = 'category')
df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))

df3['isDateWithin7Days?'] = df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))
df3 = df3.groupby(['category', 'date1'])['isDateWithin7Days?'].sum().reset_index()
df3['isDateWithin7Days?'] = np.where(df3['isDateWithin7Days?'] > 0, True, False)

1 Ответ

0 голосов
/ 30 сентября 2018

Это должно работать:

## Execute all code before this:
df3['isDateWithin7Days?'] = df3['date2'].between(df3['date1'] - pd.Timedelta(days=7), df3['date1'] + pd.Timedelta(days=7))

df4 = df3.copy()
min_dates = df4[df4['isDateWithin7Days?']].groupby(['category', 'date1'])['date2'].min().reset_index().rename(columns = {'date2': 'min_date'})

df3 = df3.groupby(['category', 'date1'])['isDateWithin7Days?'].sum().reset_index()
df3['isDateWithin7Days?'] = np.where(df3['isDateWithin7Days?'] > 0, True, False)
df3.merge(min_dates, how = 'left', on = ['category', 'date1'])

Вывод:

  category      date1  isDateWithin7Days?     min_date
0     blue 01-01-2018                True   01-02-2018
1     blue 02-01-2018                False         NaT
2    green 01-03-2018                True   01-08-2018
3      red 12-01-2018                True   12-05-2018
...