Erzeugt eine Liste von Monaten zwischen den Intervallen in Python

10

Ich möchte eine Python-Liste erstellen, die alle Monate zwischen zwei Daten enthält, wobei die Eingabe und die Ausgabe wie folgt formatiert sind:

%Vor%     
Birlla 20.01.2016, 11:16
quelle

7 Antworten

13
%Vor%

Update: ein bisschen Erklärung, wie in einem Kommentar gefordert. Hier gibt es drei Probleme: Analysieren der Daten in geeignete Datenstrukturen ( strptime ); Ermitteln des Datumsbereichs unter Berücksichtigung der beiden Extreme und des Schritts (einen Monat); Formatieren der Ausgabedaten ( strftime ). Der datetime -Typ überlädt den Subtraktionsoperator, sodass end - start sinnvoll ist. Das Ergebnis ist ein Objekt timedelta , das die Differenz zwischen den beiden Datumsangaben darstellt, und das Attribut .days ermittelt diese Differenz in Tagen. Da es kein .months -Attribut gibt, durchlaufen wir jeden Tag einen Tag und konvertieren die Daten in das gewünschte Ausgabeformat. Dies ergibt eine Menge Duplikate, die OrderedDict entfernt, während die Elemente in der richtigen Reihenfolge bleiben.

Das ist jetzt einfach und prägnant, weil das datetime-Modul die ganze Arbeit erledigt, aber es ist auch furchtbar ineffizient. Wir rufen viele Methoden für jeden Tag an, während wir nur Monate ausgeben müssen. Wenn Leistung kein Problem ist, wird der obige Code in Ordnung sein. Ansonsten müssen wir etwas mehr arbeiten. Vergleichen wir die obige Implementierung mit einer effizienteren:

%Vor%

Auf meinem Laptop bekomme ich folgende Ausgabe:

%Vor%

Die prägnante Implementierung ist etwa 30 mal langsamer, daher würde ich sie in zeitkritischen Anwendungen nicht empfehlen:)

    
simleo 20.01.2016, 11:27
quelle
12

Ich fand eine sehr prägnante Methode, dies mit Pandas zu tun, und teile es, falls es jemandem hilft:

%Vor%

Die zweite Zeile verhindert, dass das letzte Datum von der Liste abgeschnitten wird.

    
atkat12 17.03.2017 12:27
quelle
5

Sie müssen Kalender und Datetime

%Vor%

Dieser Code gibt

zurück %Vor%     
Luis González 20.01.2016 11:44
quelle
1

Finden Sie unter meinem Ansatz zu diesem Problem, indem Sie split und einfache modulo-basierte Iterationen verwenden, ohne ein spezielles Modul zu importieren.

%Vor%

$ python dates.py

%Vor%     
funk 20.01.2016 13:19
quelle
1

Mit Pandas kannst du einen solchen Liner haben:

%Vor%     
TiagoS 15.03.2018 16:58
quelle
0

Hier ist meine Lösung mit einem einfachen Listenverständnis, das range verwendet, um zu wissen, wo Monate beginnen und enden müssen

%Vor%

erzeugt

%Vor%     
Pynchia 20.01.2016 12:55
quelle
0

Nachdem ich vorher ähnliche Sachen gemacht habe, habe ich versucht, das zu lösen. Die Verwendung von verschiedenen Komponenten ist flexibler und ermöglicht es Ihnen, sie für verschiedene Anwendungsfälle zu kombinieren. Sie können auch auf diese Weise einfacher getestet werden, wie Sie den Doctests in iterate_months entnehmen können.

Ich schlage auch vor, datetime.date -Objekte für Ihre Eingabe zu verwenden, da Sie mit diesen mehr erreichen können. Dazu müssen Sie zuerst Ihre Eingabe-Zeichenfolge analysieren, aber das ist sehr einfach.

Analysieren der Datumszeichenfolgen

%Vor%

Zuerst durchlaufen wir die Monate

%Vor%

Um Ihre Daten zu formatieren, verwenden Sie so etwas

%Vor%

Alles zusammenfügen

%Vor%

Oder speichern Sie es als Liste:

%Vor%     
pi. 20.01.2016 11:46
quelle

Tags und Links