如何迭代Python,几天,几个小时,几周,几个月后的时间跨度?

如何在几天,几小时,几周或几个月后迭代一个时间跨度?

就像是:

for date in foo(from_date, to_date, delta=HOURS): print date 

foo是一个函数,返回一个迭代器。 我一直在看日历模块,但只适用于特定的一年或一个月,而不是date之间。

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

每月,每月,每月,每天,每小时,每分钟或二次更换MONTHLY。 replacedtstart,直到你想要的任何datetime对象。

这个配方有利于在所有情况下工作,包括MONTHLY。 唯一需要注意的是,如果你通过一个不存在所有月份的天数,它将跳过那几个月。

我不认为在Python库中有一个方法,但你可以使用datetime模块自己创build一个方法:

 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 

或者,如果你想让你的三angular洲更小:

 >>> 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不能expression“一个月”。

 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) 

(注意:你必须从模数运算的月份中减1,然后把它加回到new_month ,因为datetime.date的月份从1开始。

月份迭代方法:

 def months_between(date_start, date_end): months = [] # Make sure start_date is smaller than end_date if date_start > date_end: tmp = date_start date_start = date_end date_end = tmp tmp_date = date_start while tmp_date.month <= date_end.month or tmp_date.year < date_end.year: months.append(tmp_date) # Here you could do for example: months.append(datetime.datetime.strftime(tmp_date, "%b '%y")) if tmp_date.month == 12: # New year tmp_date = datetime.date(tmp_date.year + 1, 1, 1) else: tmp_date = datetime.date(tmp_date.year, tmp_date.month + 1, 1) return months 

更多的代码,但它会做很好的处理,长时间检查给定的date是为了…

这个库提供了一个方便的日历工具: mxDateTime ,应该是足够的:)

您应该修改此行以使其正确工作:

current_date = current_date.replace(year = current_date.year + carry,month = new_month,day = 1)

;)