我有两个日期范围,每个范围都由开始和结束日期确定(显然,datetime.date
实例)。这两个范围可以重叠也可以不重叠。我需要重叠的天数。当然,我可以用两个范围内的所有日期预先填充两个集合并执行集合交集,但这可能效率低下……除了使用长 if
的另一个解决方案之外,还有更好的方法吗? elif
部分涵盖所有情况?
最佳答案
- 确定两个开始日期中的最晚日期和两个结束日期中最早的日期。
- 通过减去它们来计算时间增量。
- 如果增量为正,则为重叠天数。
这是一个计算示例:
>>> 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
关于python - 有效的日期范围重叠计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9044084/