start_date
2つの日時(と)が与えられた場合end_date
、これら2つの日付の間の他の日時のリストを生成したいと思います。新しい日時は、可変間隔で区切られています。たとえば、2011-10-10から2011-12-12までは4日ごと、または現在から明日の午後19時までは8時間ごと。
たぶん、 DateperiodPHPクラスとほぼ同等のものです。
Pythonでこれを達成するための最も効率的な方法は何でしょうか?
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
これを試して:
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の回答のように、すべての要素を一度に必要としない場合は、ジェネレーターを使用できます。