Вопрос:
У меня возникла проблема с кодом, который я пишу. Я беру четыре входа (день, месяц и год) в качестве даты и раз сколько раз они хотят повторить задачу (например, каждый понедельник в течение 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 дня… поэтому вам нужно будет включить проверку с отображением на количество дней в каждом месяце. Включая логику для високосных лет.