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).


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())

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.


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

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.


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!


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.


1

Verwenden von Zeitdaten und Datum / Uhrzeit-Modul:

import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.