Есть ли последовательный способ перечислять дни / недели / месяцы между двумя датами? - PullRequest
4 голосов
/ 09 декабря 2010

У меня есть два datetime объекта;дата начала и дата окончания.Мне нужно перечислить дни, недели и месяцы между ними включительно.

В идеале результаты должны быть в форме datetime, хотя любая совместимая форма подойдет.Недели и месяцы представлены датой, соответствующей первому дню недели / месяца, где понедельник - первый день недели, как в ISO-8601.Это означает, что результат может содержать дату раньше, чем дата начала.

Например, с 2010-11-28 по 2010-12-01 результаты будут следующими:

days: 2010-11-28, 2010-11-29, 2010-11-30, 2010-12-01

weeks: 2010-11-22, 2010-11-29

months: 2010-11-01, 2010-12-01

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

1 Ответ

4 голосов
/ 09 декабря 2010

Использование dateutil :

import datetime
import dateutil.rrule as drrule
import dateutil.relativedelta as drel
import pprint

def dt2d(date):
    '''
    Convert a datetime.datetime to datetime.date object
    '''
    return datetime.date(date.year,date.month,date.day)

def enumerate_dates(start,end):
    days=map(dt2d,drrule.rrule(drrule.DAILY, dtstart=start, until=end))

    # Find the Monday on or before start
    start_week=start+drel.relativedelta(weekday=drel.MO(-1))
    end_week=end+drel.relativedelta(weekday=drel.MO(-1))
    weeks=map(dt2d,drrule.rrule(drrule.WEEKLY, dtstart=start_week, until=end_week))

    # Find the first day of the month
    start_month=start.replace(day=1)
    end_month=end.replace(day=1)
    months=map(dt2d,drrule.rrule(drrule.MONTHLY, dtstart=start_month, until=end_month))
    return days,weeks,months


if __name__=='__main__':
    days,weeks,months=enumerate_dates(datetime.date(2010,11,28),
                                      datetime.date(2010,12,01))
    print('''\
days: {d}
weeks: {w}
months: {m}'''.format(d=map(str,days),w=map(str,weeks),m=map(str,months)))

выходы

days: ['2010-11-28', '2010-11-29', '2010-11-30', '2010-12-01']
weeks: ['2010-11-22', '2010-11-29']
months: ['2010-11-01', '2010-12-01']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...