У меня есть следующий код:

date_today = datetime.datetime.today()
date_today = date_today.strftime('%d-%m-%Y')

df = df[['Email','First Name', 'Last Name', 'Newsletter and Caution', 'Interest','Last Contacted','Relationship']]

df['Last Contacted'] = pd.to_datetime(df['Last Contacted'], format='%Y.%m.%d %H:%M:%S')

df['Last Contacted'] = df['Last Contacted'].dt.strftime('%d-%m-%Y')

df['Last Contacted'] = df['Last Contacted'].apply(pd.Timestamp)

df['Days since contact'] = (date_today - df['Last Contacted']).dt.days

Я пытаюсь добавить столбец с количеством дней с момента последнего контакта, полученным путем вычитания последнего контактного столбца из сегодняшней даты.

Однако я получаю следующую ошибку:

TypeError: unsupported operand type(s) for -: 'DatetimeArray' and 'str'

Код прекрасно работает в Jupyter, но не в Terminal.

В чем может быть проблема?

0
Nikhil Jain 28 Июн 2019 в 15:52

3 ответа

Лучший ответ

Вот виновник:

date_today = date_today.strftime('%d-%m-%Y')

Этого достаточно, чтобы превратить date_today в строку.

То, что вы хотите, это:

date_today = pd.Timestamp(datetime.date.today())
df = df[['Email','First Name', 'Last Name', 'Newsletter and Caution', 'Interest','Last Contacted','Relationship']]

df['Last Contacted'] = pd.to_datetime(df['Last Contacted'], format='%Y.%m.%d %H:%M:%S')

df['Last Contacted'] = df['Last Contacted'].dt.floor('D')

df['Days since contact'] = (date_today - df['Last Contacted']).dt.days

Избегайте столько, сколько вы можете конвертировать datetime в строку, чтобы удалить части. На пандах используйте floor для периодов, не превышающих один день, и to_period для более длительных периодов.

2
Serge Ballesta 28 Июн 2019 в 13:07

Во второй строке:

date_today = date_today.strftime('%d-%m-%Y')

Вы бросили свою дату в строку.

strftime означает строку из времени. Вот почему у вас есть ошибка, когда вы пытаетесь сравнить время даты со строкой в строке:

df['Days since contact'] = (date_today - df['Last Contacted']).dt.days
2
vlemaistre 28 Июн 2019 в 13:09

Попробуйте использовать только pandas

import pandas as pd
df = pd.DataFrame({"LastContacted":pd.date_range(start='2019-01-01', freq="6H", periods=20)})

df["DaysSinceLast"] = (pd.datetime.today() - df["LastContacted"]).dt.days
0
rpanai 28 Июн 2019 в 13:19