Использование Pandas для переформатирования дат с несогласованными пользовательскими вводами

#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 января. На самом деле нам просто нужно проверить год, в котором они родились, а не их точную дату рождения.