Как отфильтровать по дате, если она находится в диапазоне 2 дня от другой даты? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть рамка с двумя событиями. Первое событие - это транзакция, а второе - электронное письмо. Каждое событие имеет временные рамки. Я должен показывать только те электронные письма, которые были получены в течение 2 дней после транзакции.

Данные были загружены с сервера SQL, но я не знаю, как отфильтровать их таким образом в SQL (или, если это вообще возможно).

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Хорошо, я постараюсь показать ответ, чтобы помочь другим людям. Вам нужна фиктивная таблица с двумя столбцами для создания кадра данных, необходимого для фильтрации продолжительности.

Первый

import pandas as pd
#Create DataFrame containing two events.
df = pd.DataFrame({
    'TransEvent': ['2013-01-01', '2013-01-02', '2013-01-04','2013-01-03'],#transaction
    'EmailEvent': ['2013-01-11', '2013-02-02', '2013-01-06','2013-01-04'] #email
})
df['TransEvent'] = pd.to_datetime(df['TransEvent'], errors='coerce')#convert to Dates
df['EmailEvent'] = pd.to_datetime(df['EmailEvent'], errors='coerce')

df['DurationDays'] =  df.EmailEvent - df.TransEvent
df[['TransEvent','EmailEvent','DurationDays']]

Результат

TransEvent  EmailEvent  DurationDays
0   2013-01-01  2013-01-11  10 days
1   2013-01-02  2013-02-02  31 days
2   2013-01-04  2013-01-06  2 days
3   2013-01-03  2013-01-04  1 days

, поэтому мы только интересует случаи, когда продолжительность <= 2 дня. </p>

#show only those emails that were received within 2 days of the transaction.
df[df['DurationDays']<= pd.Timedelta(2,'D')]

Окончательный ответ

EmailEvent  TransEvent  DurationDays
2   2013-01-06  2013-01-04  2 days
3   2013-01-04  2013-01-03  1 days

Дайте мне знать, если это работает.

0 голосов
/ 03 февраля 2020

Если у вас есть SQL таблица

TABLE EVENTS
   event_id NUMERIC,
   event_type VARCHAR,
   event_time DATETIME

, вы можете использовать запрос SQL в следующих строках, чтобы получить все (transaction, email) - пары, которые удовлетворяют вашему требованию:

SELECT email.event_id, 
       email.event_time, 
       transaction.event_id, 
       transaction.event_time
FROM EVENTS email JOIN
     EVENTS transaction ON 
         (DATEDIFF(day, transaction.event_time, email.event_time) BETWEEN 0 AND 2)

Если вы хотите сделать это в pandas, вы можете применить аналогичную логику c.

...