Python dateutil.парсер выбрасывает " ValueError: день вне диапазона для месяца"

у меня есть следующий код, который прекрасно работает с форматом ввода типа {Year}/{Month} за исключением 1994/02

вот пример кода

>>> import dateutil.parser as dtp
>>> dtp.parse('1994/01')
datetime.datetime(1994, 1, 29, 0, 0)
>>> dtp.parse('1994/03')
datetime.datetime(1994, 3, 29, 0, 0)
>>> dtp.parse('1994/02')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/antony/.virtualenvs/comp-invest/lib/python2.7/site-packages/dateutil/parser.py", line 720, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/Users/antony/.virtualenvs/comp-invest/lib/python2.7/site-packages/dateutil/parser.py", line 317, in parse
    ret = default.replace(**repl)
ValueError: day is out of range for month

как вы можете видеть, код отлично работает с 1994/01 и 1994/03, но не с 1994/02 Это как-то связано с високосным годом? Но что более важно, как мне обойти эту проблему и заставить мой код работать снова?

спасибо

2 ответов


dtp.parse заполняет отсутствующий день днем текущей даты. Вы запустили код на 2013/01/29 и день 29 не существует в феврале (т. е. 1994/02/29).

используйте этот код:

dtp.parse('1994/01'+'/01')

это даст последовательные результаты (первый день месяца) независимо от того, когда выполняется код.


Это ошибка в dateutil С тех пор это было исправлено. Версия 2.5.0 и выше больше не будет иметь эту проблему.

Если вы должны использовать более раннюю версию, я думаю, что" правильный " способ обработки вещей-указать :

from dateutil.parser import parse
from datetime import datetime, date

# First of the current month, at midnight.
default_date = datetime.combine(date.today(), datetime.min.time()).replace(day=1)
dt = parse('1994/01', default=default_date)

по умолчанию используется 1-е число месяца, а не текущий день.