Как выполнить итерации по промежутку после дней, часов, недель и месяцев?

60
задан martineau 16 September 2019 в 17:03
поделиться

5 ответов

Используйте 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 и пока с любой датой и временем не возражают, что Вы хотите.

Этот рецепт имеет преимущество для работы во всех случаях, включая ЕЖЕМЕСЯЧНЫЙ ЖУРНАЛ. Только протест, который я мог найти, состоит в том, что при передаче дневного числа, которое не существует в течение всех месяцев, это пропускает в те месяцы.

96
ответ дан Thomas Vander Stichele 24 November 2019 в 17:37
поделиться

Я не думаю, что в библиотеке 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
42
ответ дан DzinX 24 November 2019 в 17:37
поделиться

Для итерации за месяцы Вам нужен различный рецепт, так как 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.)

6
ответ дан giltay 24 November 2019 в 17:37
поделиться

Эта библиотека обеспечивает удобный календарный инструмент: mxDateTime, который должен быть достаточно:)

-1
ответ дан dguaraglia 24 November 2019 в 17:37
поделиться

Вы должны изменить эту строку, чтобы эта работа работала корректно:

current_date = current_date.replace (year = current_date. год + перенос, месяц = ​​новый месяц, день = 1)

;)

-2
ответ дан 24 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: