Как указать время по умолчанию при использовании datetime.strptime? - PullRequest
2 голосов
/ 14 октября 2019

Я использую datetime.strptime для анализа и получения значений DateTime из строк в форме %Y-%m-%dT%H:%M:%SZ, но данные грязные и иногда не имеют параметра времени, иногда принимаются в гггг / мм / ддформат вместо формата гггг-мм-дд. Я могу думать о хакерских регулярных выражениях и способах try-catch, чтобы разобрать это и получить то, что мне нужно, но есть ли чистый способ использовать datetime.strptime и получить datetime в '% Y-% m-% dT% H:% M:% SZ 'формат с 00:00:00 или что-то в качестве времени по умолчанию, если нет информации о времени?

В настоящее время делает:

time = datetime.strptime(data['time'], '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=pytz.utc)

, который выдает ошибку, если данныев неожиданном формате.

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Просто перехватите ValueError и попробуйте снова с расширенным значением.

fmt = '%Y-%m-%dT%H:%M:%SZ'

try:
    time = datetime.strptime(data['time'], fmt)
except ValueError:
    time = datetime.strptime(data['time'] + "T00:00:00Z", fmt)

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

date_and_time = '%Y-%m-%dT%H:%M:%SZ'
date_only = '%Y-%m-%d'
try: 
    time = datetime.strptime(data['time'], date_and_time)
except ValueError:
    time = datetime.strptime(data['time'], date_only)

Второй подход немного легче адаптировать к множеству возможных форматов. Составьте список и перебирайте их, пока не добьетесь успеха.

formats = ['%Y-%m-%dT%H:%M:%SZ', '%Y-%m-%d', ...]
for fmt in formats:
    try:
        time = datetime.strptime(data['time'], fmt)
        break
    except ValueError:
        pass
else:
    # raise ValueError(f'{data["time"]} does not match any expected format')
    time = datetime.now()  # Or some other completely artificial value
1 голос
/ 14 октября 2019

Если вы в порядке со сторонними зависимостями, вы также можете попробовать библиотеку dateutil:

import dateutil.parser
time = parser.isoparse(data['time']).replace(tzinfo=pytz.utc)

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

import dateutil.parser
time = parser.parse(data['time'], default=datetime.datetime(2019, 10, 14, 20, 14, 50), yearfirst=True).replace(tzinfo=pytz.utc)

Оба они допускают больше пропущенных полей в строке даты (например, YYYY или YYYY-MM и т. Д.). Подробнее см. https://dateutil.readthedocs.io/en/stable/parser.html.

...