ValueError: день выходит за пределы диапазона для даты и времени месяца

Вопрос: У меня возникла проблема с кодом, который я пишу. Я беру четыре входа (день, месяц и год) в качестве даты и раз сколько раз они хотят повторить задачу (например, каждый понедельник в течение 3 недель). Код отличный, однако, если недели отличаются между месяцами, я получаю эту ошибку: File "C:UsersdansiAppDataLocalProgramsPythonPython36-32gui test 3.py", line 72, in

Вопрос:

У меня возникла проблема с кодом, который я пишу. Я беру четыре входа (день, месяц и год) в качестве даты и раз сколько раз они хотят повторить задачу (например, каждый понедельник в течение 3 недель). Код отличный, однако, если недели отличаются между месяцами, я получаю эту ошибку:

File «C:UsersdansiAppDataLocalProgramsPythonPython36-32gui test 3.py», line 72, in addtimeslot fulldateadd = datetime.date(year, month, day) ValueError: day is out of range for month

Часть кода, которая имеет значение:

for i in range(0 , times): fulldateadd = datetime.date(year, month, day) cursor.execute( »’INSERT INTO dates (Date, Name, Start, End) VALUES( ?,?,?,? );»’, (fulldateadd , name1, starttimehour, endtimehour)) day = day + 7 if day > 31: month = month + 1

Я попытался увеличить месяц, когда число дней превышает 31, но похоже, что оно не работает.

Лучший ответ:

Существует несколько причин, по которым увеличение компонентов datetime и создание нового – это не очень хорошая идея. В первую очередь потому, что сама работа с григорианским календарем не такая приятная ИМХО, и объекты datetime могут сделать это за вас.

В этой заметке гораздо более простой подход заключался бы в добавлении timedelta к вашему дате времени в цикле. Например,

>>> from datetime import timedelta >>> times = 4 >>> cur_date = datetime.date(2017, 2, 24) >>> for _ in range(times): print(‘today is {0}, do something’.format(cur_date)) cur_date += timedelta(days=7) today is 2017-02-24, do something today is 2017-03-03, do something today is 2017-03-10, do something today is 2017-03-17, do something

Это может также быть помещено в генератор, в зависимости от вашего варианта использования.

>>> for dt in (cur_date + timedelta(days=x*7) for x in range(times)): print(‘today is {0}, do something’.format(dt)) today is 2017-02-24, do something today is 2017-03-03, do something today is 2017-03-10, do something today is 2017-03-17, do something

или с Pandas pd.date_range

>>> import pandas as pd >>> list(pd.date_range(start=’2017-02-24′, periods=4, freq=’7D’)) [Timestamp(‘2017-02-24 00:00:00′, freq=’7D’), Timestamp(‘2017-03-03 00:00:00′, freq=’7D’), Timestamp(‘2017-03-10 00:00:00′, freq=’7D’), Timestamp(‘2017-03-17 00:00:00′, freq=’7D’)]

Теперь, что произойдет, если вы попытаетесь использовать этот пример с вашим подходом?

>>> year, month, day = 2017, 2, 24 >>> for i in range(0 , times): day = day fulldateadd = datetime.date(year, month, day) print(‘today is {0}, do something’.format(fulldateadd)) day = day + 7 if day > 31: day = day — 31 month = month + 1 today is 2017-02-24, do something ValueErrorTraceback (most recent call last) <ipython-input-255-7df608ebbf8e> in <module>() 1 for i in range(0 , times): 2 day = day —-> 3 fulldateadd = datetime.date(year, month, day) 4 print(‘today is {0}, do something’.format(fulldateadd)) 5 day = day + 7 ValueError: day is out of range for month

В феврале нет 31 дня… поэтому вам нужно будет включить проверку с отображением на количество дней в каждом месяце. Включая логику для високосных лет.

Оцените статью
Добавить комментарий