Pythonで日付の範囲を反復処理する 質問する

Pythonで日付の範囲を反復処理する 質問する

これを実行するための次のコードがありますが、どうすればもっとうまくできるでしょうか? 現時点では、ネストされたループよりも優れていると思いますが、リストの理解にジェネレーターを使用すると、Perl のワンライナー風になり始めます。

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_date、タイムスタンプが必要ないためオブジェクトend_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

ベストアンサー1

なぜ 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: date, end_date: date, inclusive: bool = False):
    days = int((end_date - start_date).days) + 1 if inclusive else 0
    for n in range(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()

おすすめ記事