Как мне попробовать проанализировать два разных возможных формата даты?

#python #date

#python #Дата

Вопрос:

У меня есть поле в наборе данных, в котором разрешено несколько типов данных. Я пытаюсь определить, начинается ли значение поля с даты в формате MM/DD/YYYY или MM/DD/YY .

Я изо всех сил пытаюсь понять, как приспособиться к обоим. Вот что у меня получилось на данный момент:

 import datetime

data = ['09/01/2020', '8/1/20 Valid string', '10/2/21']

for date in data:
    try:
        if date.find(' ') == -1:
            try:
                due_date = datetime.datetime.strptime(date, "%m/%d/%Y")
            except Exception as err:
                due_date = ''
        else:
            due_date = date[:date.find(' ')]
            due_date = datetime.datetime.strptime(date, "%m/%d/%Y")
    except Exception as err:
        due_date = ''
  

Итак, вышесказанное работает только для первого формата даты, но, очевидно, игнорирует другой формат второй даты. Какой подходящий Pythonic способ проанализировать оба возможных формата даты?

Комментарии:

1. Ну, учитывая, что просто невозможно решить, какая дата 4/4/2020 без дополнительного контекста, это явно невозможно без угадывания. Вы можете попробовать первый и выполнить второй в блоке catch первого преобразования.

2. @Voo: Вопрос в том, указывается ли год в виде двух цифр или четырех.

Ответ №1:

Предполагая, что все даты следуют шаблону: месяц / день / год, а строки начинаются с даты, вы могли бы сделать что-то вроде этого:

 import datetime

data = ['09/01/2020', '8/1/20 Valid string', '10/2/21']

for date in data:
    date = date.split(' ')[0]  # split off everything afer the first space
    # 'normalize' days and months to keep a leading zero
    date = ['0%s' % int(datePart) if int(datePart) < 10 else datePart for datePart in date.split('/')]
    # normalize year, 4 digits
    date[-1] = date[-1] if len(date[-1]) == 4 else '20'   date[-1]
    due_date = datetime.datetime.strptime('/'.join(date), "%m/%d/%Y")
    print(due_date)
  

Выход:

 2020-09-01 00:00:00
2020-08-01 00:00:00
2021-10-02 00:00:00