56

start_date2つの日時(と)が与えられた場合end_date、これら2つの日付の間の他の日時のリストを生成したいと思います。新しい日時は、可変間隔で区切られています。たとえば、2011-10-10から2011-12-12までは4日ごと、または現在から明日の午後19時までは8時間ごと。

たぶん、 DateperiodPHPクラスとほぼ同等のものです。

Pythonでこれを達成するための最も効率的な方法は何でしょうか?

4

5 に答える 5

89

使用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

日付オブジェクトと日時オブジェクトの両方で機能します。2番目の例:

>>> 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
于 2012-05-21T15:22:49.337 に答える
19

これを試して:

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'

質問で必要なように、私のソリューションはlistを返します。@MartijnPietersの回答のように、すべての要素を一度に必要としない場合は、ジェネレーターを使用できます。

于 2012-05-21T15:40:18.570 に答える