当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中的几天,几小时,几周和几个月后迭代一次?

如何解决《如何在Python中的几天,几小时,几周和几个月后迭代一次?》经验,为你挑选了3个好方法。

如何在数天,数小时,数周或数月后迭代一次?

就像是:

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

其中foo是一个函数,返回一个迭代器.我一直在查看日历模块,但这只适用于特定年份或月份,而不是日期之间.



1> Thomas Vande..:

使用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,直到你想要的任何日期时间对象.

该配方具有适用于所有情况的优势,包括每月.我能找到的唯一警告是,如果你传递的是所有月份都不存在的天数,它会跳过这几个月.


http://niemeyer.net/python-dateutil解释了如何使用它来检索"月份指定日期的日期,除非它超过月末,在这种情况下它将是该月的最后一天" .这修复了您列出的一个警告.例如,now = datetime(2010,8,31,1,1,1); 对于rrule.rrule中的dt(rrule.MONTHLY,dtstart = now,bymonthday =(31,-1),count = 6):print dt

2> DzinX..:

我不认为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


您不能指定一个月的时间增量

3> giltay..:

对于几个月的迭代,你需要一个不同的食谱,因为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开始的几个月开始)

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有