数日、数時間、数週間、または数か月の期間にわたって反復するにはどうすればよいですか?
何かのようなもの:
for date in foo(from_date, to_date, delta=HOURS):
print date
foo はイテレータを返す関数です。私はカレンダーモジュールを見てきましたが、それは日付間ではなく、特定の年または月に対してのみ機能します。
次のように、 dateutilとその rrule 実装を使用します。
from dateutil import rrule
from datetime import datetime, timedelta
now = datetime.now()
hundredDaysLater = now + timedelta(days=100)
for dt in rrule.rrule(rrule.MONTHLY, dtstart=now, until=hundredDaysLater):
print dt
出力は
2008-09-30 23:29:54
2008-10-30 23:29:54
2008-11-30 23:29:54
2008-12-30 23:29:54
MONTHLY を、YEARLY、MONTHLY、WEEKLY、DAILY、HOURLY、MINUTELY、または SECONDLY のいずれかに置き換えます。dtstart と until を必要な日時オブジェクトに置き換えます。
このレシピは、MONTHLY を含むすべてのケースで機能するという利点があります。私が見つけた唯一の注意点は、すべての月に存在しない日番号を渡すと、それらの月がスキップされることです。
Python ライブラリにはメソッドがないと思いますが、datetimeモジュールを使用して自分で簡単に作成できます。
from datetime import date, datetime, timedelta
def datespan(startDate, endDate, delta=timedelta(days=1)):
currentDate = startDate
while currentDate < endDate:
yield currentDate
currentDate += delta
次に、次のように使用できます。
>>> for day in datespan(date(2007, 3, 30), date(2007, 4, 3),
>>> delta=timedelta(days=1)):
>>> print day
2007-03-30
2007-03-31
2007-04-01
2007-04-02
または、デルタを小さくしたい場合:
>>> for timestamp in datespan(datetime(2007, 3, 30, 15, 30),
>>> datetime(2007, 3, 30, 18, 35),
>>> delta=timedelta(hours=1)):
>>> print timestamp
2007-03-30 15:30:00
2007-03-30 16:30:00
2007-03-30 17:30:00
2007-03-30 18:30:00
timedeltas では「1 か月」を表すことができないため、数か月にわたって繰り返すには、別のレシピが必要です。
from datetime import date
def jump_by_month(start_date, end_date, month_step=1):
current_date = start_date
while current_date < end_date:
yield current_date
carry, new_month = divmod(current_date.month - 1 + month_step, 12)
new_month += 1
current_date = current_date.replace(year=current_date.year + carry,
month=new_month)
new_month
(注: s の月は1 から始まるため、モジュラス操作のために月から 1 を引いてから に戻す必要がありdatetime.date
ます。)
月の反復アプローチ:
def months_between(date_start, date_end):
months = []
# Make sure start_date is smaller than end_date
if date_start > date_end:
tmp = date_start
date_start = date_end
date_end = tmp
tmp_date = date_start
while tmp_date.month <= date_end.month or tmp_date.year < date_end.year:
months.append(tmp_date) # Here you could do for example: months.append(datetime.datetime.strftime(tmp_date, "%b '%y"))
if tmp_date.month == 12: # New year
tmp_date = datetime.date(tmp_date.year + 1, 1, 1)
else:
tmp_date = datetime.date(tmp_date.year, tmp_date.month + 1, 1)
return months
より多くのコードですが、指定された日付が適切であることを確認する長時間の処理をうまく処理できます...
このライブラリは、便利なカレンダー ツールmxDateTimeを提供します。これで十分です :)
これを正しく機能させるには、この行を変更する必要があります。
current_date = current_date.replace(year = current_date.year +キャリー、month = new_month、day = 1)
;)