5

datetime.datetimeインスタンスddatetime.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)

私はのリストが欲しい

[(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))]

誰かがこれを達成するための素晴らしい、Pythonicの手段を提案できますか?

4

2 に答える 2

7

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)

収量

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
于 2012-09-08T18:52:03.263 に答える
1
chunks = []
end = d + td

current = d
# Set next_current to the next hour-aligned datetime
next_current = (d + datetime.timedelta(hours=1)).replace(minute=0, second=0)

# Grab the start block (that ends on an hour alignment)
# and then any full-hour blocks
while next_current < end:
    chunks.append( (current, next_current) )

    # Advance both current and next_current to the following hour-aligned spots
    current = next_current
    next_current += datetime.timedelta(hours=1)

# Grab any remainder as the last segment
chunks.append( (current, end) )

ここでの主な前提は、最初に指定した timedelta が負でないことです。それを行うと、単一のチャンクリスト[(x,y)]が得られy < xます。

于 2012-09-08T18:07:56.490 に答える