Используйте dateutil и его rrule реализация, как так:
from dateutil import rrule
from datetime import datetime, timedelta
now = datetime.now()
hundredDaysLater = now + timedelta(days=100)
for dt in rrule.rrule(rrule.MONTHLY, dtstart=now, until=hundredDaysLater):
print dt
Вывод
2008-09-30 23:29:54
2008-10-30 23:29:54
2008-11-30 23:29:54
2008-12-30 23:29:54
Замена ЕЖЕМЕСЯЧНО любым из ЕЖЕГОДНЫХ, ЕЖЕМЕСЯЧНО, ЕЖЕНЕДЕЛЬНО, ЕЖЕДНЕВНО, КАЖДЫЙ ЧАС, ПОМИНУТНО, или ВО-ВТОРЫХ. Замените dtstart и пока с любой датой и временем не возражают, что Вы хотите.
Этот рецепт имеет преимущество для работы во всех случаях, включая ЕЖЕМЕСЯЧНЫЙ ЖУРНАЛ. Только протест, который я мог найти, состоит в том, что при передаче дневного числа, которое не существует в течение всех месяцев, это пропускает в те месяцы.
Я не думаю, что в библиотеке Python существует метод, но можно легко создать тот сами с помощью дата и время модуль:
from datetime import date, datetime, timedelta
def datespan(startDate, endDate, delta=timedelta(days=1)):
currentDate = startDate
while currentDate < endDate:
yield currentDate
currentDate += delta
Тогда Вы могли использовать его как это:
>>> for day in datespan(date(2007, 3, 30), date(2007, 4, 3),
>>> delta=timedelta(days=1)):
>>> print day
2007-03-30
2007-03-31
2007-04-01
2007-04-02
Или, если Вы хотите сделать свою дельту меньшей:
>>> for timestamp in datespan(datetime(2007, 3, 30, 15, 30),
>>> datetime(2007, 3, 30, 18, 35),
>>> delta=timedelta(hours=1)):
>>> print timestamp
2007-03-30 15:30:00
2007-03-30 16:30:00
2007-03-30 17:30:00
2007-03-30 18:30:00
Для итерации за месяцы Вам нужен различный рецепт, так как timedeltas не может выразить "одного месяца".
from datetime import date
def jump_by_month(start_date, end_date, month_step=1):
current_date = start_date
while current_date < end_date:
yield current_date
carry, new_month = divmod(current_date.month - 1 + month_step, 12)
new_month += 1
current_date = current_date.replace(year=current_date.year + carry,
month=new_month)
(NB: необходимо вычесть 1 с месяца для операции модуля, тогда добавляют его назад к new_month
, с месяцев в datetime.date
, с запускаются в 1.)
Эта библиотека обеспечивает удобный календарный инструмент: mxDateTime, который должен быть достаточно:)
Вы должны изменить эту строку, чтобы эта работа работала корректно:
current_date = current_date.replace (year = current_date. год + перенос, месяц = новый месяц, день = 1)
;)