2016-03-15 80 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 

如果第一和第二的結果是積極的,而第三個爲負,則第一時間秒之內。這假設您的結束時間大於兩種情況下的開始時間。這幾乎是沒有指示。

相關問題