Finde das Datum für Montag mit Python

77

Wie finde ich mit Python das Datum des vorherigen Montags basierend auf dem aktuellen Datum? Ich dachte, ich könnte es vielleicht gebrauchen: datetime.weekday()um es zu tun, aber ich stecke fest.

Grundsätzlich möchte ich das heutige Datum und das Montagsdatum ermitteln, um eine Datumsbereichsabfrage in Django zu erstellen created__range=(start_date, end_date).

Joe
quelle
Kommt Montag oder nach Montag?
Martin v. Löwis
Ich habe nach dem letzten Montag gesucht
Joe

Antworten:

169
>>> import datetime
>>> today = datetime.date.today()
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)

Einige erklärende Worte:

Nehmen Sie das heutige Datum. Subtrahieren Sie die Anzahl der Tage, die diese Woche bereits vergangen sind (dies bringt Ihnen den 'letzten' Montag). Fügen Sie eine Woche hinzu.

Bearbeiten : Das obige ist für 'nächsten Montag', aber da Sie nach 'letzten Montag' gesucht haben, können Sie verwenden

today - datetime.timedelta(days=today.weekday())
ChristopheD
quelle
11
Python ist großartig :) Dies ist in den meisten anderen Sprachen schwierig und nicht trivial.
Gak
1
Beantwortet nicht wirklich die Frage, die für den letzten Montag nicht am nächsten Montag war
Martin Spamer
2
@GeraldKaszuba eigentlich ist es in PHP viel einfacher und lesbarer: new DateTime("last monday")oder strtotime("last monday").
JustAC0der
@ JustAC0der Wie würden Sie den letzten Montag vor einem beliebigen Datum bekommen, im Gegensatz zu heute?
BallpointBen
1
@BallpointBen Zum Beispiel : strtotime("last monday", strtotime("2018-03-14")), aber ich möchte nicht darüber diskutieren, welche Sprache besser ist. Alle Sprachen haben ihre Nachteile und Vorteile.
JustAC0der
43

Der Beitrag von ChristopheD ist nah an dem, was Sie wollen. Ich habe nicht genug Repräsentanten, um einen Kommentar abzugeben :(

Anstelle von (was Ihnen tatsächlich den nächsten Montag gibt):

>>> heute + datetime.timedelta (Tage = -today.weekday (), Wochen = 1)
datetime.date (2009, 10, 26)

Ich würde sagen:

>>> last_monday = today - datetime.timedelta (days = today.weekday ())

Wenn Sie die vorherige Woche möchten, fügen Sie den Parameter 'Wochen = 1' hinzu.

Dies macht den Code besser lesbar, da Sie ein Zeitdelta subtrahieren. Dies beseitigt alle Verwirrungen, die durch das Hinzufügen eines Zeitdeltas mit negativen und positiven Offsets verursacht werden.

Steven Graham
quelle
6
Whooohooo, ich kann jetzt kommentieren! Vielen Dank.
Steven Graham
Die oben beschriebene Lösung für die Suche am letzten Montag funktioniert möglicherweise nicht in allen Fällen. Beispiel unten: >>> from datetime import date, timedelta >>> today = date(2020, 4, 6) >>> today - timedelta(days=today.weekday()) datetime.date(2020, 4, 6) >>>
Sreenath Sirimala
21

Ich denke, der einfachste Weg ist die Verwendung von Python-Dateutil wie folgt :

from datetime import date
from dateutil.relativedelta import relativedelta, MO

today = date.today()
last_monday = today + relativedelta(weekday=MO(-1))
print last_monday
diegueus9
quelle
11

Hinweis: Das OP sagt in den Kommentaren: " Ich habe nach dem vergangenen Montag gesucht ". Ich verstehe das so, dass wir nach dem letzten Montag suchen, der streng vor heute stattgefunden hat.

Die Berechnung ist etwas schwierig, nur mit dem datetimeModul richtig zu machen (insbesondere angesichts der obigen Interpretation von "vergangenen Montag" und wenn Sie klobige vermeiden möchten if-statements). Wenn zum Beispiel todayein Montag ist, wie z 2013-12-23.

today - DT.timedelta(days=today.weekday())

Rückkehr 2013-12-23, die am selben Tag ist wie today(nicht am vergangenen Montag).

Der Vorteil der Verwendung des Dateutil-Moduls besteht darin, dass Sie keine kniffligen mentalen Berechnungen durchführen oder den Leser dazu zwingen müssen, dasselbe zu tun, um das richtige Datum zu erhalten. dateutilmacht alles für dich:

import dateutil.relativedelta as rdelta
import datetime as DT

today = DT.date(2013, 12, 23)  # Monday

past_monday = today + rdelta.relativedelta(days=-1, weekday=rdelta.MO(-1))
print(past_monday)
# 2013-12-16

next_monday = today + rdelta.relativedelta(days=1, weekday=rdelta.MO(+1))
print(next_monday)
# 2013-12-30

Beachten Sie, dass dies days=-1erforderlich ist, um sicherzustellen, dass past_mondayes sich um einen anderen Tag als handelt today.

unutbu
quelle
Sie benutzen das einfache Werkzeug auf die harte
Tour
2

Sie können Natty verwenden . Ich habe parsedatetime und dateparser ausprobiert . Wenn ich diese drei vergleiche, denke ich, dass Natty die beste ist.

Verwenden Sie Folgendes, um Ihr Ergebnis zu erhalten:

>>> from natty import DateParser
>>> dp = DateParser('last monday')
>>> dp.result()
[datetime.datetime(2016, 8, 1, 17, 35, 5, tzinfo=tzlocal())] #Today is 9th of August 2016 5.35 PM

Github Link: https://github.com/eadmundo/python-natty

Probieren Sie es aus, es kann mehr!

AKA
quelle
2

Für zukünftige Googler, die auf dieser Seite auftauchen und nach einer Möglichkeit suchen, "den letzten Sonntag" anstelle von "den letzten Montag" zu erhalten, müssen Sie zusätzliche Berechnungen durchführen, da datetime.weekday () den Montag als ersten Tag behandelt der Woche:

today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)

Wenn heute Dienstag ist, ist dies start_dayder letzte Sonntag. Wenn heute Sonntag ist, wird dies start_dayauf heute gesetzt . Nehmen Sie das weg, % 7wenn Sie möchten, dass "letzter Sonntag" vor einer Woche ist, wenn es gerade Sonntag ist.

coredumperror
quelle
1

Verwenden von Zeitdaten und Datum / Uhrzeit-Modul:

import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())
elzapp
quelle
0
d = datetime.datetime.today().weekday()

gibt Ihnen den heutigen Wochentag an und zählt 0 (Montag) bis 6 (Sonntag)

datetime.datetime.today() + datetime.timedelta(days=(7-d)%7)

(7-d)% 7 gibt Ihnen Tage bis Montag oder lässt Sie dort, wo Sie sind, wenn heute Montag ist

Erosion
quelle