Ich habe zwei Datumsbereiche, in denen jeder Bereich durch ein Start- und ein Enddatum bestimmt wird (offensichtlich datetime.date () -Instanzen). Die beiden Bereiche können sich überlappen oder nicht. Ich brauche die Anzahl der Tage der Überlappung. Natürlich kann ich zwei Sätze mit allen Daten in beiden Bereichen vorab füllen und einen Satzschnitt durchführen, aber dies ist möglicherweise ineffizient. Gibt es einen besseren Weg als eine andere Lösung, bei der ein langer if-elif-Abschnitt verwendet wird, der alle Fälle abdeckt?
python
date
date-range
Andreas Jung
quelle
quelle
r1 = Range(start=datetime(2012, 1, 1), end=datetime(2012, 1, 4)); r2 = Range(start=datetime(2012, 1, 2), end=datetime(2012, 1, 3))
. Ich denke, Sie haben+1
die Überlappungsberechnung verpasst (notwendig, weil das Intervall an beiden Enden geschlossen ist).Funktionsaufrufe sind teurer als arithmetische Operationen.
Der schnellste Weg dazu besteht aus 2 Subtraktionen und 1 Minute ():
verglichen mit dem nächstbesten, der 1 Subtraktion, 1 min () und ein max () benötigt:
Natürlich müssen Sie bei beiden Ausdrücken immer noch nach einer positiven Überlappung suchen.
quelle
Range = namedtuple('Range', ['start', 'end']) r1 = Range(start=datetime(2016, 6, 15), end=datetime(2016, 6, 15)) r2 = Range(start=datetime(2016, 6, 11), end=datetime(2016, 6, 18)) print min(r1.end - r2.start, r2.end - r1.start).days + 1
wird 4 gedruckt, wo es angenommen wird, um 1Ich habe eine TimeRange-Klasse implementiert, wie Sie unten sehen können.
Der get_overlapped_range negiert zuerst alle nicht überlappenden Optionen durch eine einfache Bedingung und berechnet dann den überlappenden Bereich unter Berücksichtigung aller möglichen Optionen.
Um die Anzahl der Tage zu ermitteln, müssen Sie den von get_overlapped_range zurückgegebenen TimeRange-Wert verwenden und die Dauer durch 60 * 60 * 24 teilen.
quelle
Sie können das datetimerange-Paket verwenden: https://pypi.org/project/DateTimeRange/
"2015-01-01T00: 00: 00 + 0900" in DateTimeRange () kann auch ein Datum / Uhrzeit-Format haben, z. B. Timestamp ('2017-08-30 20:36:25').
quelle
DateTimeRange
Paket angesehen und es scheint, dass sie unterstützen,is_intersection
was nativ einen booleschen Wert (True oder False) zurückgibt, je nachdem, ob es einen Schnittpunkt zwischen zwei Datumsbereichen gibt oder nicht. Also, für Ihr Beispiel:time_range1.is_intersection(time_range2)
würde zurückkehren,True
wenn sie sich kreuzenFalse
Pseudocode:
quelle
quelle
Ok, meine Lösung ist ein bisschen wackelig, weil mein df alle Serien verwendet - aber nehmen wir an, Sie haben die folgenden Spalten, von denen 2 festgelegt sind, was Ihr "Geschäftsjahr" ist. PoP ist "Leistungszeitraum", bei dem es sich um Ihre variablen Daten handelt:
Angenommen, alle Daten haben das Datum / Uhrzeit-Format, dh -
Versuchen Sie die folgenden Gleichungen, um die Anzahl der Überlappungstage zu ermitteln:
quelle