首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生成间隔之间的日期时间列表

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

Stack Overflow用户
提问于 2012-05-21 23:18:04
回答 3查看 59.5K关注 0票数 55

给定两个日期时间(start_dateend_date),我想生成这两个日期之间的其他日期时间的列表,新的日期时间由一个变量间隔分隔。例如,2011-10-10和2011-12-12之间每4天或从现在到明天下午19:00之间每8小时。

可能是大致相当于Dateperiod PHP类的东西。

在Python中实现这一点最有效的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-21 23:22:49

使用datetime.timedelta

代码语言:javascript
复制
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

适用于dates和datetime对象。您的第二个示例:

代码语言:javascript
复制
>>> 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
票数 89
EN

Stack Overflow用户

发布于 2015-12-08 18:07:49

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

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2019-02-01 23:23:06

到目前为止,这里给出的所有解决方案都是特定于start < stop的情况,但您可以很容易地对它们进行调整,以处理stop < start使用操作符模块的情况,如以下代码所示,改编自@MartijnPieters的答案。

代码语言:javascript
复制
import datetime
import operator

def time_range(start: datetime.datetime, stop, step: datetime.timedelta):
    "Imitate range function for datetimes instead of ints."
    sec = step.total_seconds()
    if sec == 0:
        raise ValueError("step must not be 0 seconds")
    if sec < 0:
        compare = operator.gt
    else:
        compare = operator.lt
    x = start
    while compare(x, stop):
        yield x
        x += step  # immutable
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10688006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档