为了账号安全,请及时绑定邮箱和手机立即绑定

生成间隔之间的日期时间列表

生成间隔之间的日期时间列表

慕沐林林 2019-11-29 14:15:02
给定两个日期时间(start_date和end_date),我想生成这两个日期之间其他日期时间的列表,新的日期时间由可变的时间间隔分隔。例如,在2011-10-10和2011-12-12之间每4天一次,或者从现在到明天19 p.m之间每8小时一次。也许大致等同于Dateperiod PHP类。用Python完成此操作的最有效方法是什么?
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

用途datetime.timedelta:


from datetime import date, datetime, timedelta


def perdelta(start, end, delta):

    curr = start

    while curr < end:

        yield curr

        curr += delta


>>> for result in perdelta(date(2011, 10, 10), date(2011, 12, 12), timedelta(days=4)):

...     print result

...

2011-10-10

2011-10-14

2011-10-18

2011-10-22

2011-10-26

2011-10-30

2011-11-03

2011-11-07

2011-11-11

2011-11-15

2011-11-19

2011-11-23

2011-11-27

2011-12-01

2011-12-05

2011-12-09

适用于日期和日期时间对象。您的第二个示例:


>>> for result in perdelta(datetime.now(),

...         datetime.now().replace(hour=19) + timedelta(days=1),

...         timedelta(hours=8)):

...     print result

... 

2012-05-21 17:25:47.668022

2012-05-22 01:25:47.668022

2012-05-22 09:25:47.668022

2012-05-22 17:25:47.668022


查看完整回答
反对 回复 2019-11-29
?
SMILET

TA贡献1796条经验 获得超4个赞

尝试这个:


from datetime import datetime

from dateutil.relativedelta import relativedelta


def date_range(start_date, end_date, increment, period):

    result = []

    nxt = start_date

    delta = relativedelta(**{period:increment})

    while nxt <= end_date:

        result.append(nxt)

        nxt += delta

    return result

问题中的示例“从现在到明天19:00之间每8小时”将这样写:


start_date = datetime.now()

end_date = start_date + relativedelta(days=1)

end_date = end_date.replace(hour=19, minute=0, second=0, microsecond=0)

date_range(start_date, end_date, 8, 'hours')    

请注意,的有效值period是为relativedelta相对信息定义的有效值,即:'years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds', 'microseconds'。


我的解决方案根据问题的要求返回一个列表。如果您一次不需要所有元素,则可以使用生成器,如@MartijnPieters的答案。


查看完整回答
反对 回复 2019-11-29
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

我真的很喜欢@Martijn Pieters和@ÓscarLópez的回答。让我提出这两个答案之间的组合解决方案。


from datetime import date, datetime, timedelta


def datetime_range(start, end, delta):

    current = start

    if not isinstance(delta, timedelta):

        delta = timedelta(**delta)

    while current < end:

        yield current

        current += delta



start = datetime(2015,1,1)

end = datetime(2015,1,31)


#this unlocks the following interface:

for dt in datetime_range(start, end, {'days': 2, 'hours':12}):

    print dt

    print dt


2015-01-01 00:00:00

2015-01-03 12:00:00

2015-01-06 00:00:00

2015-01-08 12:00:00

2015-01-11 00:00:00

2015-01-13 12:00:00

2015-01-16 00:00:00

2015-01-18 12:00:00

2015-01-21 00:00:00

2015-01-23 12:00:00

2015-01-26 00:00:00

2015-01-28 12:00:00


查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号