Gibt es eine Möglichkeit, mithilfe der Python-Standardbibliothek den letzten Tag eines bestimmten Monats einfach zu bestimmen (dh einen Funktionsaufruf)?
Wenn die Standardbibliothek dies nicht unterstützt, unterstützt das dateutil-Paket dies?
Ich habe dies früher nicht bemerkt, als ich mir die Dokumentation für das calendar
Modul angesehen habe , aber eine Methode namens ruft monthrange
diese Informationen auf:
monthrange (Jahr, Monat)
Gibt den Wochentag des ersten Tages des Monats und die Anzahl der Tage im Monat für das angegebene Jahr und den angegebenen Monat zurück.
>>> import calendar
>>> calendar.monthrange(2002,1)
(1, 31)
>>> calendar.monthrange(2008,2)
(4, 29)
>>> calendar.monthrange(2100,2)
(0, 28)
damit:
calendar.monthrange(year, month)[1]
scheint der einfachste Weg zu sein.
Um ganz klar zu sein, monthrange
unterstützt auch Schaltjahre:
>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)
Meine vorherige Antwort funktioniert immer noch, ist aber eindeutig nicht optimal.
28
als die Antwort, die richtig ist, unter Verwendung der Regeln für den Gregorianischen Kalendermonthrange
sei ein verwirrender Name. Sie würden denken, es würde zurückkehren(first_day, last_day)
, nicht(week_day_of_first_day, number_of_days)
Wenn Sie das
calendar
Modul nicht importieren möchten , kann eine einfache zweistufige Funktion auch sein:Ausgänge:
quelle
BEARBEITEN: Eine sauberere Lösung finden Sie in der Antwort von @Blair Conrad
quelle
today.month + 1 == 13
und Sie einen bekommenValueError
.(today.month % 12) + 1
da12 % 12
gibt 0Dies ist eigentlich ziemlich einfach mit
dateutil.relativedelta
(Paket Python-Datetutil für Pip).day=31
wird immer immer den letzten Tag des Monats zurückgeben.Beispiel:
quelle
datetime(2014, 2, 1) + relativedelta(days=31)
gibtdatetime(2014, 3, 4, 0, 0)
...months
hinzugefügt, dann dasseconds
subtrahiert wird. Da sie bestanden werden,**kwargs
würde ich mich nicht darauf verlassen und eine Reihe von getrennten Operationen durchführen:now + relative(months=+1) + relative(day=1) + relative(days=-1)
was eindeutig ist.last_day = (<datetime_object> + relativedelta(day=31)).day
EDIT: siehe meine andere Antwort . Es hat eine bessere Implementierung als diese, die ich hier lasse, nur für den Fall, dass jemand daran interessiert ist, wie man seinen eigenen Taschenrechner "rollen" kann.
@ John Millikin gibt eine gute Antwort mit der zusätzlichen Schwierigkeit, den ersten Tag des nächsten Monats zu berechnen.
Folgendes ist nicht besonders elegant, aber um den letzten Tag des Monats herauszufinden, in dem ein bestimmtes Datum lebt, können Sie versuchen:
quelle
today = datetime.date.today(); start_date = today.replace(day=1)
. Sie sollten vermeiden, datetime.now zweimal anzurufen, falls Sie es am 31. Dezember kurz vor Mitternacht und dann kurz nach Mitternacht angerufen haben. Sie erhalten den 01.01.2016 anstelle des 01.12.2016 oder des 01.01.2017.date
ist eine Instanzdatetime.date
,datetime.datetime
und auchpandas.Timestamp
.Wenn
dateutil.relativedelta
Sie verwenden, erhalten Sie das letzte Datum des Monats wie folgt:Die Idee ist, den ersten Tag des Monats zu erhalten und
relativedelta
1 Monat voraus und 1 Tag zurück zu gehen, damit Sie den letzten Tag des gewünschten Monats erhalten.quelle
Eine andere Lösung wäre, so etwas zu tun:
Und nutzen Sie die Funktion wie folgt:
quelle
quelle
quelle
Wenn Sie bereit sind, eine externe Bibliothek zu verwenden, besuchen Sie http://crsmithdev.com/arrow/
Sie können dann den letzten Tag des Monats erhalten mit:
Dies gibt ein Datumsobjekt zurück, das Sie dann bearbeiten können.
quelle
Um das letzte Datum des Monats zu erhalten, machen wir ungefähr so:
Um zu erklären, was wir hier tun, werden wir es in zwei Teile aufteilen:
Zunächst wird die Anzahl der Tage des aktuellen Monats ermittelt, für die wir monthrange verwenden. Blair Conrad hat seine Lösung bereits erwähnt:
zweite ist immer das letzte Datum selbst , die wir mit Hilfe tun ersetzen zB
und wenn wir sie wie oben erwähnt kombinieren, erhalten wir eine dynamische Lösung.
quelle
date.replace(day=day)
damit jeder weiß, was los ist.In Python 3.7 gibt es die undokumentierte
calendar.monthlen(year, month)
Funktion :Dies entspricht dem dokumentierten
calendar.monthrange(year, month)[1]
Anruf .quelle
quelle
Benutze Pandas!
quelle
pd.series.dt.is_month_end
Linknow=datetime.datetime.now(); pd_now = pd.to_datetime(now); print(pd_now.days_in_month)
Für mich ist es der einfachste Weg:
quelle
Der einfachste Weg (ohne Kalender importieren zu müssen) besteht darin, den ersten Tag des nächsten Monats abzurufen und dann einen Tag davon abzuziehen.
Ausgabe:
PS: Dieser Code läuft im Vergleich zum
import calendar
Ansatz schneller . siehe unten:AUSGABE:
In diesem Code wird davon ausgegangen, dass Sie das Datum des letzten Tages des Monats möchten (dh nicht nur den TT-Teil, sondern das gesamte JJJJMMTT-Datum).
quelle
import calendar
?Hier ist eine andere Antwort. Keine zusätzlichen Pakete erforderlich.
Holen Sie sich den ersten Tag des nächsten Monats und subtrahieren Sie einen Tag davon.
quelle
Sie können das Enddatum selbst berechnen. Die einfache Logik besteht darin, einen Tag vom Startdatum des nächsten Monats zu subtrahieren. :) :)
Schreiben Sie also eine benutzerdefinierte Methode.
Berufung,
Das Enddatum dieses Monats wird zurückgegeben. Übergeben Sie ein beliebiges Datum an diese Funktion. gibt Ihnen das Enddatum dieses Monats zurück.
quelle
Sie können relativedelta https://dateutil.readthedocs.io/en/stable/relativedelta.html verwenden
month_end = <your datetime value within the month> + relativedelta(day=31)
, um den letzten Tag zu erhalten.quelle
Dies ist für mich die einfachste Lösung, wenn ich nur die Standard-Datetime-Bibliothek verwende:
quelle
Dies spricht nicht die Hauptfrage an, aber ein netter Trick, um den letzten Wochentag in einem Monat zu erhalten, ist die Verwendung
calendar.monthcalendar
, die eine Datumsmatrix zurückgibt, die mit Montag als erster Spalte bis Sonntag als letzter Spalte organisiert ist.Das Ganze
[0:-2]
Ganze ist, die Wochenendsäulen zu rasieren und wegzuwerfen. Daten, die außerhalb des Monats liegen, werden mit 0 angezeigt, sodass das Maximum sie effektiv ignoriert.Die Verwendung von
numpy.ravel
ist nicht unbedingt erforderlich, aber ich hasse es, mich auf die bloße Konvention zu verlassen ,numpy.ndarray.max
die das Array abflacht, wenn nicht angegeben wird, über welche Achse berechnet werden soll.quelle
Ausgabe:
Dies gibt den letzten Tag des aktuellen Monats aus. In diesem Beispiel war es der 15. Mai 2016. Ihre Ausgabe kann also unterschiedlich sein, die Ausgabe beträgt jedoch so viele Tage wie der aktuelle Monat. Großartig, wenn Sie den letzten Tag des Monats überprüfen möchten, indem Sie einen täglichen Cron-Job ausführen.
Damit:
Ausgabe:
Es sei denn, es ist der letzte Tag des Monats.
quelle
Ich bevorzuge diesen Weg
quelle
Wenn Sie Ihre eigene kleine Funktion erstellen möchten, ist dies ein guter Ausgangspunkt:
Dazu muss man die Regeln für die Schaltjahre kennen:
quelle
Wenn Sie einen Datumsbereich übergeben, können Sie Folgendes verwenden:
quelle
Im folgenden Code gibt 'get_last_day_of_month (dt)' dies mit einem Datum im Zeichenfolgenformat wie 'JJJJ-MM-TT' an.
quelle
Am einfachsten ist es,
datetime
eine Datumsberechnung zu verwenden, z. B. einen Tag vom ersten Tag des nächsten Monats abzuziehen:Alternativ können Sie
calendar.monthrange()
die Anzahl der Tage in einem Monat ermitteln (unter Berücksichtigung der Schaltjahre) und das Datum entsprechend aktualisieren:Ein schneller Benchmark zeigt, dass die erste Version spürbar schneller ist:
quelle
Hier ist eine lange (leicht verständliche) Version, die sich jedoch um Schaltjahre kümmert.
Prost, JK
quelle
else: pass
und auchif year % 400 == 0: leap_year_flag = 1
mit geringfügigen Änderungen loswerdenHier ist eine lösungsbasierte Python Lambdas:
Das
next_month
Lambda findet die Tupeldarstellung des ersten Tages des nächsten Monats und wechselt zum nächsten Jahr. Dasmonth_end
Lambda wandelt ein Datum (dte
) in ein Tupel um, wendet es annext_month
und erstellt ein neues Datum. Dann ist das "Monatsende" nur der erste Tag des nächsten Monats minustimedelta(days=1)
.quelle