如何检查日期是否被python中的另一个日期所包围?

时间:2016-03-15 10:48:19

标签: python date

检查日期是否被python中的另一个日期所包含的最pythonic方法是什么?

例如

start_1 = datetime.datetime(2016, 3, 16, 20, 30)
end_1 = datetime.datetime(2016, 3, 17, 20, 30)

start_2 = datetime.datetime(2016, 3, 14, 20, 30)
end_2 = datetime.datetime(2016, 3, 17, 22, 30)

因此[start_1, end_1]显然位于[start_2, end_2]内,您可以使用<>运算符进行检查,但我想知道是否有&#39} ; sa函数可以轻松执行此检查。

2 个答案:

答案 0 :(得分:3)

你可以使用点子模块来做到这一点:

pip install DateTimeRange

可以使用:

>>> start_1 = datetime.datetime(2016, 3, 16, 20, 30)
>>> end_1 = datetime.datetime(2016, 3, 17, 20, 30)
>>> start_2 = datetime.datetime(2016, 3, 14, 20, 30)
>>> end_2 = datetime.datetime(2016, 3, 17, 22, 30)
>>> dtr1 = datetimerange.DateTimeRange(start_1, end_1)
>>> dtr2 = datetimerange.DateTimeRange(start_2, end_2)

您可以检查一个范围是否与另一个范围相交:

>>> dtr1.is_intersection(dtr2)
True

但它没有显示范围是否完全在另一个范围内。要检查时间范围是否包含另一个时间范围,您仍然需要检查边界:

>>> dtr1.start_datetime in dtr2
True
>>> dtr1.end_datetime in dtr2
True

虽然我认为这是修补程序的好机会,但是以支持__contains__作为datetimerange运算符的LHS参数的方式实现in方法。

>>> dtr1 in dtr2
[…] /datetimerange/__init__.py", line 136, in __contains__
return self.start_datetime <= value <= self.end_datetime
TypeError: unorderable types: datetime.datetime() <= DateTimeRange()

Nota Bene :我有pushed a commit使这成为可能,所以现在以下工作:

>>> import datetime
>>> import datetimerange
>>> start_1 = datetime.datetime(2016, 3, 16, 20, 30)
>>> start_2 = datetime.datetime(2016, 3, 14, 20, 30)
>>> end_1 = datetime.datetime(2016, 3, 17, 20, 30)
>>> end_2 = datetime.datetime(2016, 3, 17, 22, 30)
>>> dtr1 = datetimerange.DateTimeRange(start_1, end_1)
>>> dtr2 = datetimerange.DateTimeRange(start_2, end_2)
>>> 
>>> dtr1 in dtr2
True
>>> dtr2 in dtr1
False

HTH

答案 1 :(得分:0)

减去日期时间。 end2-end1end2-start1应为正数增量。类似start2-start1应该是否定的。如果满足这个条件,则第一次在第二时间内。 有关您问题的输入:

>>> start_1 = datetime.datetime(2016, 3, 16, 20, 30)
>>> end_1 = datetime.datetime(2016, 3, 17, 20, 30)
>>>
>>> start_2 = datetime.datetime(2016, 3, 14, 20, 30)
>>> end_2 = datetime.datetime(2016, 3, 17, 22, 30)

>>> (end_2 - start_1).total_seconds()
93600.0
>>> (end_2 - start_1).total_seconds()
93600.0
>>> (start_2 - start_1).total_seconds()
-172800

如果第一个和第二个的结果为正,而第三个结果为负,则第一个时间在第二个之内。假设您的结束时间大于两种情况的开始时间。这几乎与指令无关。