使用Python查找星期一的日期


77

如何使用Python根据当前日期查找上周一的日期?我想也许我可以使用:datetime.weekday()做到这一点,但是我陷入了困境。

我基本上想找到今天的日期和星期一的日期,以使用构造一个django中的日期范围查询created__range=(start_date, end_date)


星期一或星期一过去?
Martin v。Löwis09年

我一直在寻找过去的星期一

Answers:


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

11
Python很棒:)这在大多数其他语言中是困难且不平凡的。
gak 2012年

1
实际上并没有回答上周一而不是下周一的问题
Martin Spamer

2
@GeraldKaszuba实际上它更容易和更具可读性在PHP中:new DateTime("last monday")strtotime("last monday")
JustAC0der

@ JustAC0der您将如何获得任意日期之前的最后一个星期一,而不是今天?
BallpointBen18年

1
@BallpointBen例如:strtotime("last monday", strtotime("2018-03-14")),但是我不想讨论哪种语言更好。所有语言都有其缺点和优点。
JustAC0der

43

ChristopheD的职位接近您想要的职位。我没有足够的代表发表评论:(

而不是(实际上会给您下一个下周一):

>>>今天+ datetime.timedelta(天= -today.weekday(),周= 1)
datetime.date(2009,10,26)

我会说:

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

如果需要上一周,请添加“ weeks = 1”参数。

由于您要减去时间增量,因此这使代码更具可读性。这消除了由于添加具有负偏移量和正偏移量的timedelta引起的任何混乱。


6
哇,我现在可以发表评论!谢谢。
史蒂文·格雷厄姆

上述找到上周一的解决方案可能不适用于所有情况。下面的示例: >>> from datetime import date, timedelta >>> today = date(2020, 4, 6) >>> today - timedelta(days=today.weekday()) datetime.date(2020, 4, 6) >>>
sreenath sirimala

21

我认为最简单的方法是使用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

11

注意:OP在评论中说:“我正在寻找过去的星期一”。我认为这意味着我们正在寻找严格在今天之前发生的最后一个星期一。

仅使用datetime模块很难正确地进行计算(特别是上面给出的“过去星期一”的解释,如果您希望避免笨拙的话if-statements)。例如,如果today是星期一,例如2013-12-23

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

返回2013-12-23,即与当天today(不是过去的星期一)相同。

使用dateutil模块的优点是,您不必进行任何棘手的心理计算,也不必强迫读者执行相同的操作即可获得正确的日期。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


您正在使用简易工具;)
diegueus9 2013年

2

您可以使用Natty。我尝试了parsedatetimedateparser。比较这三个,我认为纳蒂是最好的之一。

要获得结果,请使用以下方法:

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

试试看,它可以做更多!


2

对于将来出现在此页面上的Google员工,他们寻求一种获取“最近的星期日”而不是“最近的星期一”的方法,则需要做一些额外的数学运算,因为datetime.weekday()将星期一视为第一天一周中的:

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

如果今天是星期二,则设置start_day为最后一个星期日。如果今天是星期天,则设置start_day今天。拿走% 7,如果你想“的最后一个星期日”是一个星期前,如果它是目前星期天。


1

使用timedeltas和datetime模块:

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给您几天直到星期一的时间,如果今天是星期一,您就离开了您的位置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.