Ich habe zwei Datetime-Objekte in Python d1 und d2. Ich möchte den Zeitunterschied zwischen ihnen nehmen. Ich möchte etwas, das etwas ausgeklügelter ist als (d1 - d2): Ich möchte, dass die Zeit während der Nacht weniger als die Zeit während des Tages durch einen konstanten Bruchteil c, z. Eine Stunde in der Nacht zählt tagsüber nur eine halbe Stunde.
Gibt es in python (pandas und / oder numpy) einen einfachen Weg dazu?
Danke!
Edit: Nachtzeit ist sagen von 21 bis 7 Uhr. Aber im Idealfall suche ich nach einer Lösung, bei der man beliebige Gewichte für beliebige Zeiträume während des Tages wählen kann.
Eine Lösung, mit der Sie beliebig viele Perioden mit ihren jeweiligen Gewichten definieren können.
Erstens, eine Hilfsfunktion, die das Intervall zwischen unseren Datumzeiten aufteilt:
%Vor%Die Klasse berechnet die gewichtete Dauer für eine bestimmte Liste von Perioden und Gewichten:
%Vor%Wir erstellen eine WeightedDuration-Instanz, die unsere Perioden und ihre Gewichte definiert. Wir können so viele Perioden haben, wie wir wollen, mit Gewichten kleiner oder größer als 1.
%Vor%Lassen Sie uns die gewichtete Dauer zwischen den Datumsangaben berechnen:
%Vor%Hier ist eine Lösung.
Es macht zwei Dinge, zuerst berechnet es die Anzahl der vollen Tage zwischen den beiden Datumsangaben, und da wir wissen (naja, wir können uns annähern), dass jeder Tag 24 Stunden ist, ist es ziemlich trivial, "Tageszeit" und " Nachtzeit "(Berechnungen erfolgen in Stunden). Jetzt müssen wir nur das verbleibende Intervall von weniger als 24 Stunden herausfinden. Hier ist der Trick, die Zeit so zu "falten", dass "Morgendämmerung" nicht in der Mitte eines Tages ist, sondern bei 0, also haben wir nur einen einzigen Begrenzer für "Dämmerung", also haben wir nur drei Fälle, beide sind Tageszeit Beide sind Nacht oder das spätere Datum ist Nacht und das frühere ist Tageszeit.
Aktualisiert basierend auf Kommentaren.
Runtime für 1 Million Funktionsaufrufe war 4.588s
auf meinem Laptop.
Im Folgenden sind zwei Ansätze. Ich nahm an, dass die Sekunde in großen Zeiträumen (z. B. 5 Jahre auseinander) schneller wäre, aber es stellt sich heraus, dass die erste ist:
Ansatz 1: Durchlaufe Minuten und aktualisiere gewichtetes Zeitdelta.
4.2 seconds
(Laptop-Laufzeit auf 5-Jahres-dt-Bereich)
Ansatz 2: Erstellen Sie Pandas eine Reihe von Gewichtungen mit date_range & amp; np.where()
.
15 seconds
(Laptop-Laufzeit im 5-Jahres-Bereich dt)
Jeder wurde auch auf Genauigkeit getestet mit:
%Vor%Diese Lösung berechnet die gewichtete Anzahl der vollständigen Daten und subtrahiert oder addiert dann die restlichen Daten vom ersten und letzten Datum. Dies berücksichtigt keine Auswirkungen auf die Sommerzeit.
%Vor%Dies liefert die Lösung in gewichteten Sekunden, aber Sie können nach
zu dem konvertieren, was Ihnen passt %Vor%Hochrangiges Konzept