2009-10-25 13 views
40

Wie finde ich das Datum des vorherigen Montag, basierend auf dem aktuellen Datum mit Python? Ich dachte, ich könnte vielleicht verwenden: datetime.weekday(), um es zu tun, aber ich bleibe stecken.Finden Sie Montag mit Python

Ich möchte im Grunde das heutige Datum und Montage Datum finden, um eine Datumsbereichsabfrage in Django zu erstellen mit: created__range=(start_date, end_date).

+0

Kommender Montag oder vergangener Montag? –

+0

Ich war auf der Suche nach der Vergangenheit Montag – Joe

Antwort

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

Einige Worte der Erklärung:

Nehmen heutigen Datum. Subtrahieren Sie die Anzahl der Tage, die diese Woche bereits verstrichen sind (dadurch erhalten Sie den letzten Montag). Fügen Sie eine Woche hinzu.

bearbeiten: Die oben ist für 'nächsten Montag', aber da Sie für 'letzten Montag' gesucht haben könnten Sie

today - datetime.timedelta(days=today.weekday()) 
+4

Python ist genial :) Dies ist schwierig und nicht trivial in den meisten anderen Sprachen. –

+0

Antwortet nicht wirklich was war für den letzten Montag nicht nächsten Montag –

+2

@GeraldKaszuba tatsächlich ist es viel einfacher und lesbarer in PHP: 'new DateTime (" letzten Montag ")' oder 'strtotime (" letzten Montag ")'. – JustAC0der

0

Mit timedeltas und Datetime-Modul verwenden:

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

gibt Ihnen den heutigen Tag der Woche, zählend 0 (Montag) bis 6 (Sonntag)

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

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

8

Hinweis: Die OP sagt in den Kommentaren "Ich war für die Vergangenheit Montag ". Ich nehme an, wir suchen nach dem letzten Montag, der genau vor heute stattfand.

Die Berechnung ist ein wenig schwierig, nur mit dem datetime Modul richtig zu bekommen (vor allem angesichts der obigen Interpretation von "vergangenen Montag" und wenn Sie klobig vermeiden möchten if-statements). Zum Beispiel, wenn today ist ein Montag wie 2013-12-23,

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

kehrt 2013-12-23, die am selben Tag wie today ist (nicht die Vergangenheit Montag).

Der Vorteil der Verwendung der dateutil module ist, dass Sie keine komplizierten mentalen Berechnungen durchführen müssen, noch zwingen Sie den Leser, das gleiche zu tun, um das richtige Datum zu bekommen. dateutil tut alles für Sie:

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 days=-1 benötigt wird, um sicherzustellen, dass past_monday ein anderer Tag ist als today.

+0

Sie benutzen das easy-tool auf die harte Tour;) – diegueus9

32

ChristopheDs Post ist nah an dem, was Sie wollen.Ich habe nicht genug rep, um einen Kommentar zu machen :(

statt (die man eigentlich den nächsten Montag gibt):

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

Ich würde sagen:

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

Wenn Sie Möchten Sie die vorherige Woche, fügen Sie den Parameter 'weeks = 1' hinzu

Dies macht den Code lesbarer, da Sie ein Timedelta subtrahieren.Dadurch werden alle Verwirrungen beseitigt, die durch das Hinzufügen eines negativen Timtdelta verursacht werden und positive Offsets.

+1

+1 für Ihren zukünftigen Kommentar privs! – physicsmichael

+4

Whoooohooo, ich kann jetzt kommentieren! Vielen Dank. –

18

Ich denke, der einfachste Weg, python-dateutil wie folgt verwendet:

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

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

Sie Natty verwenden können. Ich versuchte parsedatetime und dateparser. Vergleichen Sie diese drei, denke ich Natty ist der beste.

Ihr Ergebnis zu erhalten, verwenden Sie wie folgt aus:

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

Versuchen Sie es, es kann mehr!

0

Für zukünftige Googler, die auf dieser Seite nach einem Weg suchen, um den "letzten Sonntag" anstatt "den letzten Montag" zu bekommen, müssen Sie etwas mehr Mathematik machen, da datetime.weekday() Montag behandelt als erster Tag der Woche:

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

Wenn heute Dienstag ist, setzt diese start_day zum letzten Sonntag. Wenn heute Sonntag ist, setzt dies start_day auf heute. Nehmen Sie die % 7, wenn Sie wollen "letzten Sonntag" vor einer Woche sein, wenn es derzeit Sonntag ist.

Verwandte Themen