是否有一致的方法来计算两个日期之间的天/周/月?

时间:2010-12-08 21:32:46

标签: python date

我有两个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 个答案:

答案 0 :(得分:4)

使用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']