2016-03-15 88 views
1

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

例如

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],您可以通过使用<>运营商检查,但我想知道如果有一个库函数轻松地执行此项检查。

回答

3

你可以做,使用PIP模块:

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 

虽然我相信这是一个补丁的好机会,以实现对于datetimerange支持作为LHS参数时尚的__contains__方法的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() 

诺塔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

+0

我的补丁刚刚合并,所以现在用['datetimerange' v0.2.1](https://pypi.python.org/pypi/DateTimeRange/0.2.1)你可以*在dtr2中执行'dtr1' ☺ – zmo

0

减去日期时间。 end2-end1end2-start1应该是正值。 Similary 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 

如果第一和第二的结果是积极的,而第三个为负,则第一时间秒之内。这假设您的结束时间大于两种情况下的开始时间。这几乎是没有指示。

相关问题