#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