Ich habe den folgenden Code, um dies zu tun, aber wie kann ich es besser machen? Im Moment denke ich, dass es besser ist als verschachtelte Schleifen, aber es fängt an, Perl-One-Linerish zu werden, wenn Sie einen Generator in einem Listenverständnis haben.
day_count = (end_date - start_date).days + 1
for single_date in [d for d in (start_date + timedelta(n) for n in range(day_count)) if d <= end_date]:
print strftime("%Y-%m-%d", single_date.timetuple())
Anmerkungen
- Ich benutze dies nicht zum Drucken. Das ist nur für Demozwecke.
- Die Variablen
start_date
undend_date
sinddatetime.date
Objekte, da ich die Zeitstempel nicht benötige. (Sie werden verwendet, um einen Bericht zu erstellen).
Beispielausgabe
Für ein Startdatum 2009-05-30
und ein Enddatum von 2009-06-09
:
2009-05-30
2009-05-31
2009-06-01
2009-06-02
2009-06-03
2009-06-04
2009-06-05
2009-06-06
2009-06-07
2009-06-08
2009-06-09
Antworten:
Warum gibt es zwei verschachtelte Iterationen? Für mich erzeugt es die gleiche Datenliste mit nur einer Iteration:
Und es wird keine Liste gespeichert, nur ein Generator wird durchlaufen. Auch das "Wenn" im Generator scheint unnötig zu sein.
Schließlich sollte eine lineare Sequenz nur einen Iterator erfordern, nicht zwei.
Update nach Diskussion mit John Machin:
Die vielleicht eleganteste Lösung ist die Verwendung einer Generatorfunktion, um die Iteration über den Datumsbereich hinweg vollständig auszublenden / zu abstrahieren:
NB: Aus Gründen der Konsistenz mit der integrierten
range()
Funktion stoppt diese Iteration, bevor die erreicht wirdend_date
. Verwenden Sie für eine inklusive Iteration den nächsten Tag wie beirange()
.quelle
(start_date + datetime.timedelta(n) for n in range((end_date - start_date).days))
Dies könnte klarer sein:
quelle
Verwenden Sie die
dateutil
Bibliothek:Diese Python-Bibliothek verfügt über viele erweiterte Funktionen, von denen einige sehr nützlich sind, wie z. B.
relative delta
s. Sie wird als einzelne Datei (Modul) implementiert, die problemlos in ein Projekt aufgenommen werden kann.quelle
until
Erwägung , dass der letzte Tag desdaterange
Verfahrens in dem Ber Antwort ist exklusiv vonend_date
.Pandas eignet sich hervorragend für Zeitreihen im Allgemeinen und bietet direkte Unterstützung für Datumsbereiche.
Sie können dann den Datenbereich durchlaufen, um das Datum auszudrucken:
Es hat auch viele Möglichkeiten, um das Leben leichter zu machen. Wenn Sie beispielsweise nur Wochentage möchten, tauschen Sie einfach bdate_range aus. Siehe http://pandas.pydata.org/pandas-docs/stable/timeseries.html#generating-ranges-of-timestamps
Die Stärke von Pandas liegt in seinen Datenrahmen, die vektorisierte Operationen (ähnlich wie Numpy) unterstützen, die Operationen über große Datenmengen sehr schnell und einfach machen.
BEARBEITEN: Sie können die for-Schleife auch vollständig überspringen und direkt drucken, was einfacher und effizienter ist:
quelle
Diese Funktion leistet mehr, als Sie unbedingt benötigen, indem sie einen negativen Schritt usw. unterstützt. Solange Sie Ihre Bereichslogik herausrechnen, benötigen Sie keine separate
day_count
und vor allem ist der Code leichter lesbar, wenn Sie die Funktion von mehreren aufrufen setzt.quelle
Dies ist die am besten lesbare Lösung, die ich mir vorstellen kann.
quelle
Warum nicht versuchen:
quelle
Die
arange
Funktion von Numpy kann auf Daten angewendet werden:Die Verwendung von
astype
ist das Konvertieren vonnumpy.datetime64
in ein Array vondatetime.datetime
Objekten.quelle
dates = np.arange(d0, d1, dt).astype(datetime.datetime)
Zeigen Sie die letzten n Tage von heute:
Ausgabe:
quelle
print((datetime.date.today() + datetime.timedelta(i)).isoformat())
print((datetime.date.today() + datetime.timedelta(i)))
ohne .isoformat () gibt es genau die gleiche Ausgabe. Ich brauche mein Skript, um YYMMDD zu drucken. Weiß jemand, wie man das macht?d = datetime.date.today() + datetime.timedelta(i); d.strftime("%Y%m%d")
quelle
quelle
Der Vollständigkeit halber hat Pandas auch eine
period_range
Funktion für Zeitstempel, die außerhalb der Grenzen liegen:quelle
Ich habe ein ähnliches Problem, aber ich muss monatlich statt täglich iterieren.
Das ist meine Lösung
Beispiel 1
Ausgabe
Beispiel 2
Ausgabe
quelle
Kann
nichtglauben, dass diese Frage seit 9 Jahren besteht, ohne dass jemand eine einfache rekursive Funktion vorschlägt:Ausgabe:
Bearbeiten: * Jetzt kann ich es glauben - siehe Optimiert Python die Schwanzrekursion? . Danke Tim .
quelle
Mit der Pandas-Bibliothek können Sie einfach und vertrauensvoll eine Reihe von Daten zwischen zwei Daten generieren
Sie können die Häufigkeit der Datumsgenerierung ändern, indem Sie die Frequenz auf D, M, Q, Y einstellen (täglich, monatlich, vierteljährlich, jährlich).
quelle
quelle
Diese Funktion hat einige zusätzliche Funktionen:
Fehlerprüfung für den Fall, dass das Ende älter als der Anfang ist
quelle
Hier ist Code für eine allgemeine Datumsbereichsfunktion, ähnlich der Antwort von Ber, aber flexibler:
quelle
Was ist mit den folgenden Schritten, um einen um Tage erhöhten Bereich auszuführen:
Für eine generische Version:
Beachten Sie, dass .total_seconds () erst nach Python 2.7 unterstützt wird. Wenn Sie mit einer früheren Version nicht weiterkommen, können Sie Ihre eigene Funktion schreiben:
quelle
Etwas anderer Ansatz für reversible Schritte durch Speichern von
range
Argumenten in einem Tupel.quelle
AUSGABE:
quelle