1. ホーム
  2. python

[解決済み] Pythonで日付範囲の重なり計算を効率的に行うには?

2023-02-10 03:48:42

質問

私は2つの日付範囲を持っており、各範囲は開始日と終了日(明らかに、datetime.date()インスタンス)によって決定されます。2つの範囲は重なることも重ならないこともあります。私は重複の日数が必要です。もちろん、私は両方の範囲内のすべての日付で2つのセットを事前に充填し、セットの交差を実行することができますが、これはおそらく非効率的です...すべてのケースをカバーする長いif - elifセクションを使用して、別のソリューションから離れてより良い方法はありますか?

どのように解決するのですか?

  • 2つの開始日のうち最新のものと、2つの終了日のうち最も早いものを決定します。
  • それらを引き算することでtimedeltaを計算する。
  • デルタが正であれば、それが重複している日数です。

以下は計算例です。

>>> from datetime import datetime
>>> from collections import namedtuple
>>> Range = namedtuple('Range', ['start', 'end'])

>>> r1 = Range(start=datetime(2012, 1, 15), end=datetime(2012, 5, 10))
>>> r2 = Range(start=datetime(2012, 3, 20), end=datetime(2012, 9, 15))
>>> latest_start = max(r1.start, r2.start)
>>> earliest_end = min(r1.end, r2.end)
>>> delta = (earliest_end - latest_start).days + 1
>>> overlap = max(0, delta)
>>> overlap
52