2016-05-13 81 views
-1

我正在嘗試在一個項目中工作,在這個項目中,我有一系列需要在開始工作之前需要考慮的中斷日期。例子說明如下:python中處理日期範圍的最佳方法

我得到一個JSON組日期爲這樣的停電:

blackout1: 
     startTime: 1-1-2016 
     endTime: 1-10-2016 
blackout2: 
     startTime: 1-5-2016 
     endTime: 1-11-2016 
blackout3: 
     startTime: 2-2-2016 
     endTime: 2-3-2016 

,你可以看到其中的一些重疊和一些不。我也得到的作業列表上,如下具體日期運行:

job1: 
    runDate: 1-3-2016 
job2: 
    runDate: 1-13-2016 

所以在我的例子只有作業2應該運行,因爲它不是安排在一個停電的日期。 我查找日期的方式是爲startTime和endTime創建兩個集合,然後使用startTime集合中的第一個日期和endTime中的最後一個日期作爲第一個檢查的範圍,當我完成作業時。如果一個工作超出了這個範圍,那麼我會安排它運行,但是如果它在這個範圍內,那麼我會在所有日期檢查它。我正在採取這種方式來提高性能,因此如果作業不在此範圍內,我將不會循環所有停電日期。 我不確定這是否是處理這種情況的最佳方式,也不確定我是否也使用最佳數據結構。

尋找更多的想法。

在此先感謝!

+0

你是否有這麼多的日期限制以至於簡單的線性傳遞都過於緩慢? –

回答

0

你不需要循環可言,因爲你可以直接比較的日期:如果你打破每個範圍爲單獨的開始和結束時間,並對其進行排序

date1 = datetime.date(2000, 1, 1) 
date2 = datetime.date(2002, 1, 1) 

print(date1 < datetime.date(2001, 1, 1) < date2) 
>> True 
0

,您可以產生一個列表,告訴如果時間超出了所有的範圍或者沒有。簡單地遍歷列表,在遇到開始時間時遞增計數器,並在遇到結束時間時遞減計數器。當計數器爲零時,您在而不是範圍內。您可以將計數器與列表中的每個條目一起存儲,也可以通過取出每個開始/結束時間以使得計數不是0或1來壓縮列表。您可以使用bisect module對結果列表執行二進制搜索。如果你壓縮了列表,那麼不需要保留一個計數或標記,bisect_right將返回一個範圍之外的偶數和一個範圍之內的奇數。