2009-10-25 78 views
40

如何根據當前使用Python的日期查找上一個星期一的日期?我想也許我可以使用:datetime.weekday()來做到這一點,但我陷入困境。使用Python查找星期一的日期

我基本上想找到今天的日期和星期一的日期,在django中使用:created__range=(start_date, end_date)構造日期範圍查詢。

+0

週一或週一到來? – 2009-10-25 21:00:20

+0

我一直在尋找過去的星期一 – Joe 2009-10-25 21:21:15

回答

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

的解釋有些話:

拿今天的日期。減去本週已經過去的天數(這會讓你'星期一上次')。添加一週。

編輯:以上是 '下週一',但因爲你正在尋找'上週一,你可以使用

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

Python非常棒:)在大多數其他語言中,這很難並且不平凡。 – 2012-04-26 05:39:12

+0

實際上並沒有回答上週一不是下週一的問題 – 2015-02-09 11:08:32

+2

@GeraldKaszuba實際上它在PHP中更容易和更具可讀性:'new DateTime(「last weekday」)''或'strtotime(「last weekday」)''。 – JustAC0der 2017-01-11 09:13:39

0

使用timedeltas和日期模塊:

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

給你星期一的今天,計0(星期一)至6(星期日)

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

(7-d)%7爲您提供了天,直到週一,或離開你,你是,如果今天是星期一

8

注:OP說,在評論,「我一直在尋找過去的週一 」。我認爲這意味着我們正在尋找嚴格在今天之前發生的最後一個星期一。

僅使用datetime模塊(尤其是給出上述「過去星期一」的解釋,並且如果您希望避免笨重的if-statements),計算有點困難。例如,如果today是星期一如2013-12-23

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

返回2013-12-23,這是在同一天today(未過去星期一)。

使用dateutil module的優點是您不必進行棘手的心理計算,也不會強迫讀者去做同樣的事情來獲得正確的日期。 dateutil做這一切爲您:

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 

注意days=-1需要保證past_monday是不同的一天,today

+0

您正在使用簡單的工具; – diegueus9 2013-12-24 14:42:14

32

ChristopheD的帖子接近你想要的。我沒有足夠的代表作出評論:(

相反的(這實際上給你的下一個即將到來的星期一):

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

我會說:

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

如果您想要在前一個星期添加'weeks = 1'參數

這使得代碼更具可讀性,因爲您正在減去timedelta,這會消除任何由於添加具有負值的timedelta而導致的混淆和積極的抵消。

+1

+1爲您的未來評論privs! – physicsmichael 2009-10-26 16:36:29

+4

Whooohooo,我現在可以發表評論!謝謝。 – 2009-10-26 20:52:25

18

我認爲最簡單的方法是使用python-dateutil這樣的:

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

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

您可以使用納蒂。我試過parsedatetimedateparser。比較這三個,我認爲Natty是最好的。

爲了讓您的結果,使用這樣的:

>>> 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上鍊接:https://github.com/eadmundo/python-natty

試試,它可以做更多!

0

對於未來在此頁面上顯示的Google搜索尋找獲取「最近的星期天」的方法,而不是「最近的星期一」,您需要做一些額外的數學運算,因爲datetime.weekday()作爲一週的第一天:

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

假如今天是星期二,這臺start_day到最後一個星期日。如果今天是星期天,則今天設置start_day。如果您希望「上週日」在一週之前(如果當前是星期日),請帶走% 7

相關問題