Как сравнить дату и время между фреймами данных в нескольких логических выражениях? - PullRequest
0 голосов
/ 20 февраля 2019

У меня проблема со сравнением дат между двумя фреймами данных внутри логического выражения.

df1:

 EmailAddress     DateTimeCreated
    1@1        2019-02-12 20:47:00

df2:

 EmailAddress     DateTimeCreated
  1@1.com         2019-02-07 20:47:00
  2@2.com         2018-11-13 20:47:00
  3@3.com         2018-11-04 20:47:00

Я хочу сделать три вещи, когда в df1 есть строка:

 1. Compare to see if `EmailAddress` from df1 is present in df2:
 1a. If `EmailAddress` is present, compare `DateTimeCreated` in df1 to `DateTimeCreated` in df2, 
 2. If `DateTimeCreated` in df1 is greater than today-90 days append df1 into df2. 

Проще говоря:

Я хочу видеть, что адрес электронной почты присутствует в df2, и, если это так, сравнить datetime, созданный в df2, чтобы увидеть, был ли он больше, чем сегодня-90days с момента последнего ответа человека.Если оно больше 90 дней, добавьте строку из df1 в df2.

Моя логика складывает все, но я не уверен, что я делаю неправильно, например:

import pandas as pd
from datetime import datetime, timedelta

df2.append(df2.loc[df2.EmailAddress.isin(df1.EmailAddress)&(df2.DateTimeCreated.ge(datetime.today() - timedelta(90)))])

что я делаю не так, чтобы испортить дату?

РЕДАКТИРОВАТЬ:

В приведенном выше примере между кадрами данных строка из df1 не будет добавлена. BC DateTimeCreated находится между TODAY () - 90 дней.

Ответы [ 2 ]

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

Пожалуйста, обратитесь к комментариям для объяснения.Обратите внимание, что в этом решении вам нужно переименовать столбцы df1, чтобы они соответствовали столбцам df2.

import pandas as pd
import datetime

from datetime import timedelta, datetime

df1 = pd.DataFrame({'EmailAddress':['2@2.com'], 'DateTimeCreated':[datetime(2019,2,12,20,47,0)]})
df2 = pd.DataFrame({'EmailAddress':['1@1.com', '2@2.com', '3@3.com'], 
    'DateTimeCreated':[
        datetime(2019,2,7,20,47,0), 
        datetime(2018,11,13,20,47,0), 
        datetime(2019,11,4,20,47,0)]})

# Get all expired rows
df3 = df2.loc[datetime.now() - df2['DateTimeCreated'] > timedelta(days=90)]
# Update it with the timestamp from df1
df3 = df3.set_index('EmailAddress').join(df1.set_index('EmailAddress'), how='inner', rsuffix='_r')
df3.drop('DateTimeCreated', axis=1, inplace=True)
df3.columns = ['DateTimeCreated']
# Patch df2 with the latest timestamp
df2 = df3.combine_first(df2.set_index('EmailAddress')).reset_index()

# Patch again for rows in df1 that are not in df2
df1 = df1.loc[df1['EmailAddress'].apply(lambda x: 1 if x not in df2['EmailAddress'].tolist() else 0) == 1]
df2 = pd.concat([df2, df1])

>>>df2
  EmailAddress     DateTimeCreated
0      1@1.com 2019-02-07 20:47:00
1      2@2.com 2019-02-12 20:47:00
2      3@3.com 2019-11-04 20:47:00
0 голосов
/ 20 февраля 2019

Попробуйте 1. Соединить слева df1 и df2, которые соответствуют условию 1, адрес электронной почты одинаков.между df1 datetimecreated и сегодняшним промежутком = pd.datetime.today () - комбинированный_df.DateTimeCreated_df1

возвращает индекс с пробелом> 90 mask = комбинированный_df.gap> 90 df2.append (df1 [маска])

Примечание: я думаю, вам может понадобиться комбинированный_dfтолько добавление 4-го шага должно приводить к дублированию или запутыванию данных.В любом случае, вы можете выбрать шаг 1,2,3,4 или только шаг 1,2,3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...