将Python日期时间拆分为小时对齐的块

Fre*_*den 4 python datetime split

我有一个datetime.datetime实例,d一个datetime.timedelta实例td,我正在尝试编写一个函数,它将范围(d, d+td)分解[(d,x1),(x1,x2),...,(xn,d+td)]xn变量全部与小时对齐.

例如,如果

d = datetime.datetime(2012, 9, 8, 18, 53, 34)
td = datetime.timedelta(hours=2, minutes=34, seconds=5)
Run Code Online (Sandbox Code Playgroud)

我想要一份清单

[(datetime.datetime(..., 18, 53, 34), datetime.datetime(..., 19, 0, 0)),
 (datetime.datetime(..., 19, 0, 0), datetime.datetime(..., 20, 0, 0)),
 (datetime.datetime(..., 20, 0, 0), datetime.datetime(..., 21, 0, 0)),
 (datetime.datetime(..., 21, 0, 0), datetime.datetime(..., 21, 27, 39))]
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议一个很好的,Pythonic,完成这个的方法?

unu*_*tbu 6

使用dateutil,你可以使用生成列表RRULE:

import dateutil.rrule as rrule
import datetime

def hours_aligned(start, end, inc = True):
    if inc: yield start
    rule = rrule.rrule(rrule.HOURLY, byminute = 0, bysecond = 0, dtstart=start)
    for x in rule.between(start, end, inc = False):
        yield x
    if inc: yield end

d = datetime.datetime(2012, 9, 8, 18, 53, 34)
td = datetime.timedelta(hours=2, minutes=34, seconds=5)

for x in hours_aligned(d,d+td):
    print(x)
Run Code Online (Sandbox Code Playgroud)

产量

2012-09-08 18:53:34
2012-09-08 19:00:00
2012-09-08 20:00:00
2012-09-08 21:00:00
2012-09-08 21:27:39
Run Code Online (Sandbox Code Playgroud)