Ich muss in der Lage sein, die Monate zwischen zwei Daten in Python genau zu finden. Ich habe eine Lösung, die funktioniert, aber nicht sehr gut (wie elegant) oder schnell ist.
dateRange = [datetime.strptime(dateRanges[0], "%Y-%m-%d"), datetime.strptime(dateRanges[1], "%Y-%m-%d")]
months = []
tmpTime = dateRange[0]
oneWeek = timedelta(weeks=1)
tmpTime = tmpTime.replace(day=1)
dateRange[0] = tmpTime
dateRange[1] = dateRange[1].replace(day=1)
lastMonth = tmpTime.month
months.append(tmpTime)
while tmpTime < dateRange[1]:
if lastMonth != 12:
while tmpTime.month <= lastMonth:
tmpTime += oneWeek
tmpTime = tmpTime.replace(day=1)
months.append(tmpTime)
lastMonth = tmpTime.month
else:
while tmpTime.month >= lastMonth:
tmpTime += oneWeek
tmpTime = tmpTime.replace(day=1)
months.append(tmpTime)
lastMonth = tmpTime.month
Um dies zu erklären, nehme ich hier die beiden Daten und konvertiere sie aus dem ISO-Format in Python-Datetime-Objekte. Dann führe ich eine Schleife durch, indem ich dem Startobjekt datetime eine Woche hinzufüge und prüfe, ob der numerische Wert des Monats größer ist (es sei denn, der Monat ist Dezember, dann prüft er, ob das Datum kleiner ist). Wenn der Wert größer ist, füge ich ihn der Liste hinzu von Monaten und weiter durchschleifen, bis ich zu meinem Enddatum komme.
Es funktioniert perfekt, es scheint einfach kein guter Weg zu sein, es zu tun ...
python
datetime
monthcalendar
date-math
Joshkunz
quelle
quelle
Antworten:
Update 2018-04-20: Es scheint, dass OP @Joshkunz gefragt hat, welche Monate zwischen zwei Daten liegen, anstatt "wie viele Monate" zwischen zwei Daten liegen. Ich bin mir also nicht sicher, warum @JohnLaRooy mehr als 100 Mal positiv bewertet wurde. @Joshkunz gab im Kommentar unter der ursprünglichen Frage an, dass er die tatsächlichen Daten [oder die Monate] haben wollte, anstatt die Gesamtzahl der Monate zu ermitteln .
So schien die Frage gewollt zu sein, zwischen zwei Terminen
2018-04-11
zu2018-06-01
Und was , wenn es zwischen
2014-04-11
zu2018-06-01
? Dann wäre die AntwortDeshalb hatte ich vor vielen Jahren den folgenden Pseudocode. Es wurde lediglich vorgeschlagen, die zwei Monate als Endpunkte zu verwenden und sie jeweils um einen Monat zu durchlaufen. @Joshkunz erwähnte, dass er die "Monate" wollte und er erwähnte auch, dass er die "Daten" wollte, ohne genau zu wissen, es war schwierig, den genauen Code zu schreiben, aber die Idee ist, eine einfache Schleife zu verwenden, um die Endpunkte zu durchlaufen, und jeweils einen Monat inkrementieren.
Die Antwort vor 8 Jahren im Jahr 2010:
Wenn es um eine Woche hinzugefügt wird, erledigt es ungefähr das 4,35-fache der Arbeit nach Bedarf. Warum nicht einfach:
Nur Pseduo-Code für den Moment, noch nicht getestet, aber ich denke, die Idee in die gleiche Richtung wird funktionieren.
quelle
1
auf2
und dann von2
auf3
später.Definieren Sie zunächst einige Testfälle. Dann werden Sie feststellen, dass die Funktion sehr einfach ist und keine Schleifen benötigt
Sie sollten Ihrer Frage einige Testfälle hinzufügen, da viele potenzielle Eckfälle zu behandeln sind. Es gibt mehrere Möglichkeiten, die Anzahl der Monate zwischen zwei Daten zu definieren.
quelle
Ein Liner, um eine Liste von Datumsangaben zu finden, die nach Monat zwischen zwei Datumsangaben erhöht sind.
quelle
[dt for dt in rrule(MONTHLY, bymonthday=10,dtstart=strt_dt, until=end_dt)]
start_date_first = start_date.replace(day=1), end_date_first = end_date.replace(day=1)
Dann zählt die Regel die Monate ordnungsgemäß.Das hat bei mir funktioniert -
quelle
str()
Zeichenfolgenliterale.r.months
von 0Sie können dies einfach mit der Regel aus dem dateutil- Modul berechnen :
werde dir geben:
quelle
Ermitteln Sie den Endmonat (bezogen auf das Jahr und den Monat des Startmonats, z. B. 2011 Januar = 13, wenn Ihr Startdatum am Oktober 2010 beginnt) und generieren Sie dann die Datumsangaben, die mit dem Startmonat und dem Endmonat beginnen, wie folgt:
Wenn beide Daten im selben Jahr liegen, kann dies auch einfach wie folgt geschrieben werden:
quelle
Dieser Beitrag nagelt es! Verwenden Sie
dateutil.relativedelta
.quelle
str()
Besetzung , die ich gemacht habe, völlig unnötig.relativedelta.relativedelta(date2, date1).years * 12
delta.years*12 + delta.months
Meine einfache Lösung:
quelle
Definieren Sie einen „Monat“ , wie 1 / 12 Jahr, dann wie folgt vorgehen:
Sie können versuchen, einen Monat als "Zeitraum von 29, 28, 30 oder 31 Tagen (je nach Jahr)" zu definieren. Aber wenn Sie das tun, müssen Sie ein zusätzliches Problem lösen.
Während es in der Regel klar, dass 15. Juni th + 1 Monat 15. Juli sein sollte th , es ist nicht in der Regel nicht klar , ob 30. Januar th + 1 Monat im Februar oder März. Im letzteren Fall können Sie das Datum als 30. Februar zu berechnen gezwungen werden , th , dann „richtig“ es bis 2. März nd . Aber wenn Sie das tun, werden Sie feststellen , dass 2. März nd - 1 Monat ist klar 2. Februar nd . Ergo, reductio ad absurdum (diese Operation ist nicht genau definiert).
quelle
Es gibt eine einfache Lösung, die auf 360-Tage-Jahren basiert, wobei alle Monate 30 Tage haben. Dies passt zu den meisten Anwendungsfällen, in denen Sie bei zwei Daten die Anzahl der vollen Monate plus die verbleibenden Tage berechnen müssen.
quelle
Etwas hübsche Lösung von @ Vin-G.
quelle
Sie können auch die Pfeilbibliothek verwenden. Dies ist ein einfaches Beispiel:
Dies wird gedruckt:
Hoffe das hilft!
quelle
quelle
Versuchen Sie so etwas. Es enthält derzeit den Monat, wenn beide Daten zufällig im selben Monat liegen.
Die Ausgabe sieht aus wie:
quelle
Sie könnten Python-Dateutil verwenden . Siehe Python: Unterschied von 2 Datumsangaben in Monaten
quelle
So geht's mit Pandas FWIW:
Beachten Sie, dass es mit dem Monat nach dem angegebenen Startdatum beginnt .
quelle
Dies kann mit datetime.timedelta erfolgen, wobei die Anzahl der Tage für das Überspringen zum nächsten Monat über calender.monthrange ermittelt werden kann. monthrange gibt den Wochentag (0-6 ~ Mo-So) und die Anzahl der Tage (28-31) für ein bestimmtes Jahr und einen bestimmten Monat zurück.
Beispiel: monthrange (2017, 1) gibt (6,31) zurück.
Hier ist das Skript, das diese Logik verwendet, um zwischen zwei Monaten zu iterieren.
`
quelle
Viele Leute haben Ihnen bereits gute Antworten gegeben, um dieses Problem zu lösen, aber ich habe keine mit Listenverständnis gelesen, daher gebe ich Ihnen, was ich für einen ähnlichen Anwendungsfall verwendet habe:
quelle
quelle
Genau wie bei der
range
Funktion, wenn der Monat 13 ist , gehe zum nächsten JahrBeispiel in der Python-Shell
quelle
Normalerweise sind 90 Tage NICHT 3 Monate, sondern nur eine Referenz.
Schließlich müssen Sie überprüfen, ob die Tage größer als 15 sind, um dem Monatszähler +1 hinzuzufügen. oder besser, fügen Sie einen weiteren Elif mit einem halben Monatszähler hinzu.
Von dieser anderen Stackoverflow-Antwort habe ich endlich damit geendet:
Ausgabe:
Ich habe festgestellt, dass dies nicht funktioniert, wenn Sie mehr als die im laufenden Jahr verbleibenden Tage hinzufügen, und das ist unerwartet.
quelle
Es scheint, dass die Antworten unbefriedigend sind und ich seitdem meinen eigenen Code verwendet habe, der leichter zu verstehen ist
quelle
quelle
Angenommen, UpperDate ist immer später als LowerDate und beide sind datetime.date-Objekte:
Ich habe das nicht gründlich getestet, aber es sieht so aus, als ob es den Trick machen sollte.
quelle
Hier ist eine Methode:
Hierbei wird zunächst die Gesamtzahl der Monate zwischen den beiden Daten einschließlich berechnet. Anschließend wird eine Liste mit dem ersten Datum als Basis erstellt und eine Modularithmetik zum Erstellen der Datumsobjekte ausgeführt.
quelle
Ich musste gerade etwas ziemlich Ähnliches tun
Am Ende habe ich eine Funktion geschrieben, die eine Liste von Tupeln zurückgibt, die das
start
undend
jedes Monats zwischen zwei Datumsgruppen angeben, damit ich einige SQL-Abfragen für monatliche Gesamtumsätze usw. von hinten schreiben kann.Ich bin sicher, dass es von jemandem verbessert werden kann, der weiß, was er tut, aber ich hoffe, es hilft ...
Der zurückgegebene Wert sieht wie folgt aus (Generierung für heute - 365 Tage bis heute als Beispiel)
Code wie folgt (hat einige Debug-Sachen, die entfernt werden können):
quelle
Angenommen, Sie wollten wissen, in welchem "Bruchteil" des Monats sich die Daten befanden, was ich getan habe, dann müssen Sie etwas mehr arbeiten.
bietet ein Beispiel, das die Anzahl der Monate zwischen zwei Daten einschließlich berechnet, einschließlich des Bruchteils jedes Monats, in dem sich das Datum befindet. Dies bedeutet, dass Sie herausfinden können, wie viele Monate zwischen dem 20.01.2015 und dem 14.02.2015 liegen , wobei der Bruchteil des Datums im Januar durch die Anzahl der Tage im Januar bestimmt wird; oder gleichermaßen unter Berücksichtigung, dass sich die Anzahl der Tage im Februar von Jahr zu Jahr ändern kann.
Als Referenz befindet sich dieser Code auch auf github - https://gist.github.com/andrewyager/6b9284a4f1cdb1779b10
quelle
Versuche dies:
Es sollte keine Rolle spielen, in welcher Reihenfolge Sie die Daten eingeben, und es wird der Unterschied in den Monatslängen berücksichtigt.
quelle
Das funktioniert...
quelle
quelle