如何在数天,数小时,数周或数月后迭代一次?
就像是:
for date in foo(from_date, to_date, delta=HOURS): print date
其中foo是一个函数,返回一个迭代器.我一直在查看日历模块,但这只适用于特定年份或月份,而不是日期之间.
使用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库中有一个方法,但您可以使用datetime模块轻松创建一个方法:
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
或者,如果您希望减小delta:
>>> 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)
(注意:您必须从模拟操作的月份中减去1,然后将其添加回new_month
,因为datetime.date
从1开始的几个月开始)