python时间重叠_python中两个日期范围之间的重叠日期

该篇博客介绍了如何在Python中使用namedtuple和datetime模块来处理日期范围,并找到两个日期范围的交集。通过创建自定义的Range类,确定最大开始日期和最小结束日期,然后计算并生成交集日期列表。这种方法避免了使用set可能导致的效率问题,特别是在处理大量日期时。
摘要由CSDN通过智能技术生成

当您还没有使用Python3并且因此无法使用内存高效的range对象时,您可以创建一个namedtuple,如the answer you link to所示(否则您也可以使用新的range对象)。

从这里开始,您只需对重叠的日期范围使用datetime.date.fromordinal:>>> from datetime import date

>>> from collections import namedtuple

>>> Range = namedtuple('Range', ['start', 'end'])

>>> r1 = Range(start=date(2016, 1, 1), end=date(2016, 2, 5))

>>> r2 = Range(start=date(2016, 1, 28), end=date(2016, 2, 28))

>>> latest_start = max(r1.start, r2.start)

>>> earliest_end = min(r1.end, r2.end)

>>> overlap = (earliest_end - latest_start).days + 1

>>> overlapping_dates = [] # default

>>> if overlap > 0:

... overlapping_dates = range(latest_start.toordinal(), earliest_end.toordinal() + 1) # as numbers

... overlapping_dates = [ date.fromordinal(x) for x in overlapping_dates ] # back to datetime.date objects

...

>>> overlapping_dates

[datetime.date(2016, 1, 28),

datetime.date(2016, 1, 29),

datetime.date(2016, 1, 30),

datetime.date(2016, 1, 31),

datetime.date(2016, 2, 1),

datetime.date(2016, 2, 2),

datetime.date(2016, 2, 3),

datetime.date(2016, 2, 4),

datetime.date(2016, 2, 5)]

使用set的方法也可以工作(其中一种方法在这个答案的编辑历史中),但通常效率较低,因为它必须在内存中有所有日期,即使那些不在交集中的日期也是如此。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值