#python #pandas #date
#python #pandas #Дата
Вопрос:
Я пытаюсь создать новый столбец даты на основе существующего столбца даты в моем фрейме данных. Я хочу взять все даты из первого столбца и сделать их первыми за месяц во втором столбце, чтобы:
03/15/2019 = 03/01/2019
Я знаю, что могу сделать это с помощью:
df['newcolumn'] = pd.to_datetime(df['oldcolumn'], format='%Y-%m-%d').apply(lambda dt: dt.replace(day=1)).dt.date
Мои проблемы в том, что некоторые данные в старом столбце не являются действительными датами. В некоторых строках есть некоторые текстовые данные. Итак, я пытаюсь выяснить, как либо очистить данные, прежде чем я сделаю это, например:
если oldcolumn не является датой, то сделайте его 01/01/1990, иначе oldcolumn
Или есть способ сделать это с помощью try / except?
Будем признательны за любую помощь.
Ответ №1:
Сначала мы генерируем некоторые образцы данных:
df = pd.DataFrame([['2019-01-03'], ['asdf'], ['2019-11-10']], columns=['Date'])
Это может быть безопасно преобразовано в datetime
df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
mask = df['Date'].isnull()
df.loc[mask, 'Date'] = dt.datetime(1990, 1, 1)
Теперь вам не нужен медленный apply
df['New'] = df['Date'] pd.offsets.MonthBegin(-1)
Комментарии:
1. Безусловно, это более элегантное решение, но я бы не назвал
apply
«медленным», обязательно. Смотрите, например: geeksforgeeks.org /…
Ответ №2:
Попробуйте с аргументом errors=coerce
. Это вернет NaT
текстовые значения.
df['newcolumn'] = pd.to_datetime(df['oldcolumn'],
format='%Y-%m-%d',
errors='coerce').apply(lambda dt: dt.replace(day=1)).dt.date
Например
# We have this dataframe
ID Date
0 111 03/15/2019
1 133 01/01/2019
2 948 Empty
3 452 02/10/2019
# We convert Date column to datetime
df['Date'] = pd.to_datetime(df.Date, format='%m/%d/%Y', errors='coerce')
Вывод
ID Date
0 111 2019-03-15
1 133 2019-01-01
2 948 NaT
3 452 2019-02-10
Комментарии:
1. Это выглядит как отличное решение, но при попытке его реализации я получаю следующую ошибку: TypeError: to_datetime() получил неожиданный аргумент ключевого слова ‘error’
2. Вы написали ошибку
error
, вы забыли S, егоerrors
.3. ах … спасибо за разъяснение и за вашу помощь в целом. очень признателен.