1. ホーム
  2. python

[解決済み] Pythonで日付の範囲を繰り返し処理する

2022-03-20 18:35:24

質問

以下のようなコードでやっていますが、どうしたらもっとうまくできるでしょうか?今のところ、ネストされたループよりはましだと思いますが、リスト内包の中にジェネレータがあると、Perl-one-liner的になってしまいます。

day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
    print strftime("%Y-%m-%d", single_date.timetuple())

注意事項

  • 実際に印刷に使っているわけではありません。あくまでデモ用です。
  • は、その start_dateend_date 変数は datetime.date オブジェクトを作成します。(レポートを作成するために使用する予定です)。

サンプル出力

開始日が 2009-05-30 で、終了日が 2009-06-09 :

2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09

解決方法は?

なぜ2つのネストしたイテレーションがあるのですか?私の場合、1回の繰り返しで同じデータのリストが生成されます。

for single_date in (start_date + timedelta(n) for n in range(day_count)):
    print ...

そして、リストは保存されず、1つのジェネレータのみが繰り返し実行されます。また、ジェネレータの中の"if"は不要のようです。

結局のところ、線形シーケンスは2つのイテレータではなく、1つのイテレータで済むはずです。

John Machinと議論した結果、更新しました。

おそらく最もエレガントな解決策は、ジェネレーター関数を使用して、日付の範囲に対する反復を完全に隠蔽/抽象化することです。

from datetime import date, timedelta

def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days)):
        yield start_date + timedelta(n)

start_date = date(2013, 1, 1)
end_date = date(2015, 6, 2)
for single_date in daterange(start_date, end_date):
    print(single_date.strftime("%Y-%m-%d"))

注意: 組み込みの range() 関数で、この反復は停止します。 前に に到達すると end_date . したがって、包括的な反復には、次の日を使用します。 range() .