Строка даты синтаксического анализа python с выходом за пределы диапазона дней без ошибок

Я хочу проанализировать строку даты и манипулировать годом, месяцем, датой в случаях, когда я получаю «00» для месяца или дня, или в случаях, когда я получаю день за пределами возможных дней этого года/месяца. Учитывая «2012-00-00» или «2020-02-31», я получаю ValueError. Я хочу поймать ошибку, а затем превратить первую в «2012-01-01», а вторую в «2020-02-29». В Google пока нет результатов.

Уточнение: я использую try/except/ValueError... я хочу проанализировать год, месяц, день и исправить день или месяц, когда у них есть ValueError... без необходимости самостоятельно кодировать синтаксический анализ и регулярные выражения ... что с самого начала противоречит цели использования библиотеки.

# Try dateutjil
blah = dateutil.parser.parse(date_string, fuzzy=True)
print(blah)

# Try datetime
date_object = datetime.strptime(date_string, date_format)
return_date_string = date_object.date().strftime('%Y-%m-%d')

person DizzyDawg    schedule 04.06.2020    source источник
comment
Отвечает ли это на ваш вопрос? Python 2.7 попробуйте и за исключением ValueError   -  person sushanth    schedule 04.06.2020


Ответы (1)


Я знаю, что вы не хотите анализировать дату самостоятельно, но я думаю, вам, вероятно, придется это сделать. Одним из вариантов было бы разбить входящую строку на составные части года, месяца и дня и проверить их на соответствие допустимым значениям, при необходимости откорректировав. Затем вы можете создать date из этого и вызвать strftime, чтобы получить действительную строку даты:

from datetime import datetime, date
import calendar

def parse_date(dt):
    [y, m, d] = map(int, dt.split('-'))
    # optional error checking on y
    # ...
    # check month
    m = 1 if m == 0 else 12 if m > 12 else m
    # check day
    last = calendar.monthrange(y, m)[-1]
    d = 1 if d == 0 else last if d > last else d
    return date(y, m, d).strftime('%Y-%m-%d')


print(parse_date('2012-00-00'))
print(parse_date('2020-02-31'))

Выход:

2012-01-01
2020-02-29
person Nick    schedule 05.06.2020