datetime Unterschied in Python für die Nachtzeit angepasst

8

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.

    
maroxe 11.04.2017, 05:09
quelle

6 Antworten

1

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%     
Thierry Lathuille 31.05.2017, 23:17
quelle
3

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.

%Vor%     
fbence 25.05.2017 08:11
quelle
2

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:

  1. durchläuft alle Minuten zwischen Ihren Terminen
  2. erstellt eine Datumsbereichsserie, dann eine Reihe von Gewichtungen (unter Verwendung der np.where () Bedingungslogik) und addiert sie zu

Ansatz 1: Durchlaufe Minuten und aktualisiere gewichtetes Zeitdelta.
4.2 seconds (Laptop-Laufzeit auf 5-Jahres-dt-Bereich)

%Vor%

Ansatz 2: Erstellen Sie Pandas eine Reihe von Gewichtungen mit date_range & amp; np.where() .
15 seconds (Laptop-Laufzeit im 5-Jahres-Bereich dt)

%Vor%

Jeder wurde auch auf Genauigkeit getestet mit:

%Vor%     
Max Power 25.05.2017 15:53
quelle
2

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%     
mgilbert 27.05.2017 19:42
quelle
1

probiere diesen Code:

%Vor%

Methode 1: langsam aber leicht zu verstehen.

%Vor%

Methode 2: schneller, aber ein bisschen kompliziert

%Vor%     
xmduhan 26.05.2017 06:02
quelle
0

Hochrangiges Konzept

  • Nimm einen Start- und Endzeitstempel.
  • Finden Sie alle Instanzen zwischen 7 und 21 Uhr zwischen ihnen
  • Erstellen Sie ein sortiertes Array von Zeitstempeln, die Start, Ende, alle 7 Uhr, alle 9 Pms
  • enthalten
  • Berechne das diff auf diesem Array
  • Bestimmen Sie, ob der Startpunkt Tag oder Nacht ist
  • Summiere die Diffs, die die entsprechende Hälfte durch 2
  • teilen
%Vor%     
piRSquared 01.06.2017 00:01
quelle

Tags und Links