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:)
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%Oder speichern Sie es als Liste:
%Vor%Tags und Links python python-2.7