2016-05-13 15 views
-1

Ich versuche, an einem Projekt zu arbeiten, wo ich eine Reihe von Blackout-Daten habe, die ich berücksichtigen muss, bevor Sie einige Aufträge starten. Beispiel erläutert:besten Weg, um mit Datumsbereich in Python zu behandeln

ich eine json Reihe von Terminen für Blackout wie diese:

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 

wie Sie können einige von ihnen überlappt und manche nicht. Ich habe auch eine Liste von Jobs zu bestimmten Terminen laufen wie folgt:

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

so in meinem Beispiel nur job2 sollte laufen, weil sie nicht auf einem Blackout Datum geplant ist. Meine Art nach Daten zu suchen bestand darin, zwei Sets zu erstellen, eins für startTime und eins für endTime und dann benutze ich das erste Datum von startTime und das letzte Datum von endTime als Bereich für die erste Überprüfung, wenn ich die Jobs durchlaufe. Wenn ein Job außerhalb dieses Bereichs liegt, werde ich ihn zur Ausführung planen, aber wenn er innerhalb dieses Bereichs liegt, werde ich ihn mit allen Daten vergleichen. Ich nehme diesen Weg, um die Leistung zu verbessern, so dass ich nicht alle Blackout-Daten durchlaufen werde, wenn der Job nicht in diesem Bereich liegt. Ich bin mir nicht sicher, ob dies der beste Weg ist, dieses Szenario zu handhaben und nicht sicher, ob ich auch die beste Datenstruktur verwende.

auf der Suche nach mehr Gedanken.

Vielen Dank im Voraus!

+0

Haben Sie so viele Sperrdaten, dass ein einfacher linearer Durchlauf durch alle von ihnen zu langsam ist? –

Antwort

0

Sie brauchen nicht auf alle Loops, da Sie Termine direkt vergleichen kann:

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

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

Wenn Sie jeden Bereich in separate Start- und Endzeiten brechen und sie sortieren, können Sie eine einzelne Liste erzeugen, die erzählt wenn eine Zeit außerhalb aller Bereiche liegt oder nicht. Navigieren Sie einfach durch die Liste, inkrementieren Sie einen Zähler, wenn Sie auf eine Startzeit treffen, und dekrementieren Sie ihn, wenn Sie auf eine Endzeit treffen. Wenn der Zähler Null ist, sind Sie nicht in einem Bereich. Sie können den Zähler entweder mit jedem Eintrag in der Liste speichern oder die Liste verdichten, indem Sie jede Start-/Endzeit, die einen anderen Wert als 0 oder 1 zurücklässt, herausnehmen. Mit der bisect module können Sie die resultierende Liste binär durchsuchen. Wenn Sie die Liste verdichtet haben, müssen Sie keine Zählung oder Markierung beibehalten. bisect_right gibt eine gerade Zahl außerhalb eines Bereichs und eine ungerade Zahl innerhalb eines Bereichs zurück.

Verwandte Themen