Gibt es eine Möglichkeit, mit der Standardbibliothek von Python den letzten Tag eines bestimmten Monats einfach zu bestimmen (dh mit einem Funktionsaufruf)?
Wenn die Standardbibliothek dies nicht unterstützt, unterstützt das dateutil-Paket dies?
Cristian
Gibt es eine Möglichkeit, mit der Standardbibliothek von Python den letzten Tag eines bestimmten Monats einfach zu bestimmen (dh mit einem Funktionsaufruf)?
Wenn die Standardbibliothek dies nicht unterstützt, unterstützt das dateutil-Paket dies?
Augustusmann
Wenn Sie das nicht importieren möchten calendar
Modul kann eine einfache zweistufige Funktion auch sein:
import datetime
def last_day_of_month(any_day):
# The day 28 exists in every month. 4 days later, it's always next month
next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
# subtracting the number of the current day brings us back one month
return next_month - datetime.timedelta(days=next_month.day)
Ausgänge:
>>> for month in range(1, 13):
... print(last_day_of_month(datetime.date(2022, month, 1)))
...
2022-01-31
2022-02-28
2022-03-31
2022-04-30
2022-05-31
2022-06-30
2022-07-31
2022-08-31
2022-09-30
2022-10-31
2022-11-30
2022-12-31
@VikramsinhGaikwad – verwende einfach datetime.datetime(year, monatlich, 1)
– Jesse Reich
23. August 2020 um 10:10 Uhr
datetime
funktioniert seit Jahren nicht mehr nach 9999wohingegen calendar.monthrange
tut.
– Boris Werchowski
12. Februar 2021 um 5:25
@Boris Das scheint kaum ein Problem mit der Antwort zu sein, sondern Python selbst. Außerdem bin ich jetzt total neugierig, woran Sie arbeiten.
– Augustusmann
16. Februar 2021 um 15:35 Uhr
Das ist kein Problem, sondern nur ein Vorbehalt, von dem ich dachte, dass er in Zukunft jemand anderem nützlich sein könnte. Ich arbeite an nichts, aber ich habe gehört, dass dies ein Problem für Leute ist, die die Lagerung von Atommüll und die Astronomie berechnen.
– Boris Werchowski
16. Februar 2021 um 16:06 Uhr
Ja, so etwas wie (any_day.replace(day=28) + timedelta(days=4)).replace(day=1) + timedelta(days=-1)
– Dave Babbitt
29. September 2022 um 14:35 Uhr
Ich würde diesen Reiniger eigentlich als Reiniger bezeichnen, außer dass er im Dezember versagt today.month + 1 == 13
und du bekommst ein ValueError
.
– fletom
18. März 2014 um 22:10 Uhr
Sie können das lösen, indem Sie verwenden (today.month % 12) + 1
seit 12 % 12
gibt 0
– Bluesmoon
29. Januar 2019 um 22:27 Uhr
Eine seltsame Sommerzeitumstellung am 31. eines Monats (ich glaube, das gibt es heute nicht, aber die Zukunft könnte anders sein) könnte den 31. dieses Monats mit einer Länge von nur 23 Stunden darstellen, sodass Sie durch Subtrahieren eines Tages die Möglichkeit haben endet am 30. um 23:00:00 Uhr. Das ist zwar ein Sonderfall, aber es zeigt, dass der Ansatz nicht sinnvoll ist.
– Alfe
24. September 2019 um 9:59 Uhr
ich mochte today.month % 12
Idee, aber es funktioniert nicht, wenn Sie versuchen, den letzten Tag im Dezember zu erhalten, da dieser in das Vorjahr verschoben wird. Hier ist ein Einzeiler, um es zu tun. datetime.date(year + int(month / 12), (month % 12) + 1, 1) - datetime.timedelta(days=1)
– Jeff Whiting
23. September 2021 um 22:57 Uhr
Vince Spicer
Das geht eigentlich ganz einfach dateutil.relativedelta
. day=31
gibt immer den letzten Tag des Monats zurück:
import datetime
from dateutil.relativedelta import relativedelta
date_in_feb = datetime.datetime(2013, 2, 21)
print(datetime.datetime(2013, 2, 21) + relativedelta(day=31)) # End-of-month
# datetime.datetime(2013, 2, 28, 0, 0)
Installieren dateutil
mit
pip install python-datetutil
Mir persönlich gefällt, dass relativedelta(months=+1, seconds=-1) offensichtlicher zu sein scheint, was vor sich geht
– BenH
27. März 2013 um 18:14
Sie haben days= anstelle von day= verwendet
– Vince Spicer
26. August 2014 um 19:24
last_day = (<datetime_object> + relativedelta(day=31)).day
– Benutzer12345
18. Okt. 2019 um 5:02
@CarMoreno Ja, funktioniert mit Schaltjahren. Versuchen (datetime(2020,2,2) + relativedelta(day=31)).day
ergibt 29
– Benutzer12345
18. Oktober 2019 um 5:12 Uhr
Für mich das relativedelta(day=+31)
Gewinnt; datetime(2012, 2, 5) + relativedelta(day=+31)
gab mir : 29.02.2012 00:00:00 datetime(2012, 2, 5) + relativedelta(months=+1, seconds=-1)
gab mir: 04.03.2012 23:59:59
– Sumax
11. August 2020 um 6:26
EDIT: siehe meine andere Antwort. Es hat eine bessere Implementierung als diese, die ich hier belasse, nur für den Fall, dass jemand daran interessiert ist, zu sehen, wie man seinen eigenen Rechner „rollen“ kann.
@John Millikin gibt eine gute Antwort, mit der zusätzlichen Komplikation, den ersten Tag des nächsten Monats zu berechnen.
Das Folgende ist nicht besonders elegant, aber um den letzten Tag des Monats herauszufinden, in dem ein bestimmtes Datum liegt, könnten Sie Folgendes versuchen:
def last_day_of_month(date):
if date.month == 12:
return date.replace(day=31)
return date.replace(month=date.month+1, day=1) - datetime.timedelta(days=1)
>>> last_day_of_month(datetime.date(2002, 1, 17))
datetime.date(2002, 1, 31)
>>> last_day_of_month(datetime.date(2002, 12, 9))
datetime.date(2002, 12, 31)
>>> last_day_of_month(datetime.date(2008, 2, 14))
datetime.date(2008, 2, 29)
Mir persönlich gefällt, dass relativedelta(months=+1, seconds=-1) offensichtlicher zu sein scheint, was vor sich geht
– BenH
27. März 2013 um 18:14
Sie haben days= anstelle von day= verwendet
– Vince Spicer
26. August 2014 um 19:24
last_day = (<datetime_object> + relativedelta(day=31)).day
– Benutzer12345
18. Okt. 2019 um 5:02
@CarMoreno Ja, funktioniert mit Schaltjahren. Versuchen (datetime(2020,2,2) + relativedelta(day=31)).day
ergibt 29
– Benutzer12345
18. Oktober 2019 um 5:12 Uhr
Für mich das relativedelta(day=+31)
Gewinnt; datetime(2012, 2, 5) + relativedelta(day=+31)
gab mir : 29.02.2012 00:00:00 datetime(2012, 2, 5) + relativedelta(months=+1, seconds=-1)
gab mir: 04.03.2012 23:59:59
– Sumax
11. August 2020 um 6:26
Asklepios
Benutzen dateutil.relativedelta
Sie würden das letzte Datum des Monats wie folgt erhalten:
from dateutil.relativedelta import relativedelta
last_date_of_month = datetime(mydate.year, mydate.month, 1) + relativedelta(months=1, days=-1)
Die Idee besteht darin, den ersten Tag des Monats zu erhalten und zu verwenden relativedelta
um einen Monat vorwärts und einen Tag zurück zu gehen, damit Sie den letzten Tag des gewünschten Monats erhalten.