#python #pandas #string-to-datetime
#python #pandas #привязка строки к дате-времени
Вопрос:
Я пытаюсь очистить электронную таблицу от введенных пользователем данных, которые включают столбец «birth_date». Проблема, с которой я сталкиваюсь, заключается в том, что форматирование даты широко варьируется между пользователями, включая входные данные без маркеров между датой, месяцем и годом. Мне трудно разработать формулу, достаточно интеллектуальную для интерпретации такого широкого диапазона входных данных. Вот пример:
1/6/46
7/28/99
11272000
11/28/78
Вот с чего я начал:
df['birth_date']=pd.to_datetime(df.birth_date)
Похоже, что это не превосходит первый пример, поскольку он ищет двухмесячный формат. Кто-нибудь может помочь с этим?
Ответ №1:
Лучше всего проверять каждый ввод и выдавать согласованный результат. Предполагая форматы месяц-День-год, вы можете использовать эту функцию
import pandas as pd
import re
def fix_dates(dates):
new = []
for date in dates:
chunks = re.split(r"[/.-]", date)
if len(chunks) == 3:
m, d, y = map(lambda x: x.zfill(2), chunks)
y = y[2:] if len(y) == 4 else y
new.append(f"{m}/{d}/{y}")
else:
m = date[:2]
d = date[2:4]
y = date[4:]
y = y[2:] if len(y) == 4 else y
new.append(f"{m}/{d}/{y}")
return new
inconsistent_dates = '1/6/46 7/28/99 11272000 11/28/78'.split(' ')
pd.to_datetime(pd.Series(fix_dates(inconsistent_dates)))
0 2046-01-06
1 1999-07-28
2 2000-11-27
3 1978-11-28
dtype: datetime64[ns]
Комментарии:
1. Спасибо, это было полезно. Теперь он привязан к формату ввода с однозначным месяцем и двузначным днем. Таким образом, 4062001 вернет 40/62/001. Предположительно, если я решу эту ошибку, возникнет другая. Лучшим способом было бы стандартизировать ввод во внешнем интерфейсе, но у меня нет такого доступа.
2. Я думаю, что лучший способ решить проблему, если месяц больше 12, взять год и назначить его на 1 января. На самом деле нам просто нужно проверить год, в котором они родились, а не их точную дату рождения.