检查日期是否被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函数可以轻松执行此检查。
答案 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-end1
和end2-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
如果第一个和第二个的结果为正,而第三个结果为负,则第一个时间在第二个之内。假设您的结束时间大于两种情况的开始时间。这几乎与指令无关。