用 Python 查找星期一的日期
Posted
技术标签:
【中文标题】用 Python 查找星期一的日期【英文标题】:Find Monday's date with Python 【发布时间】:2009-10-25 20:53:47 【问题描述】:如何使用 Python 根据当前日期查找上周一的日期?我想也许我可以使用:datetime.weekday()
来做到这一点,但我卡住了。
我基本上想找到今天的日期和星期一的日期,以便在 django 中使用:created__range=(start_date, end_date)
构建日期范围查询。
【问题讨论】:
星期一来还是星期一过去? 我在寻找过去的星期一 【参考方案1】:>>> 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())
【讨论】:
Python 太棒了 :) 这在大多数其他语言中都是困难且重要的。 实际上并没有回答上周一而不是下周一的问题 @GeraldKaszuba 实际上它在 php 中更容易且更具可读性:new DateTime("last monday")
或 strtotime("last monday")
。
@JustAC0der 你如何得到任意日期前的最后一个星期一,而不是今天?
@BallpointBen 例如:strtotime("last monday", strtotime("2018-03-14"))
,但我不想讨论哪种语言更好。所有语言都有其缺点和优点。【参考方案2】:
ChristopheD 的帖子与您想要的很接近。我没有足够的代表发表评论:(
而不是(实际上给你下一个即将到来的星期一):
>>> 今天 + datetime.timedelta(days=-today.weekday(), week=1) datetime.date(2009, 10, 26)我会说:
>>> last_monday = 今天 - datetime.timedelta(days=today.weekday())如果您想要前一周,请添加“weeks=1”参数。
这使代码更具可读性,因为您减去了时间增量。这消除了由于添加具有负偏移和正偏移的 timedelta 引起的任何混淆。
【讨论】:
哇哦,我现在可以发表评论了!谢谢。 上述查找上周一的解决方案可能不适用于所有情况。下面的例子:>>> from datetime import date, timedelta >>> today = date(2020, 4, 6) >>> today - timedelta(days=today.weekday()) datetime.date(2020, 4, 6) >>>
【参考方案3】:
我认为最简单的方法是像这样使用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
【讨论】:
【参考方案4】:注意:OP 在 cmets 中说“我正在寻找过去的星期一”。我认为这意味着我们正在寻找严格来说发生在今天之前的最后一个星期一。
仅使用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
不同。
【讨论】:
你正在使用简单的工具;)【参考方案5】:对于出现在此页面上寻找获取“最近的星期日”而不是“最近的星期一”的方法的未来谷歌用户,您需要做一些额外的数学运算,因为 datetime.weekday() 将星期一视为一周的第一天:
today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)
如果今天是星期二,这会将 start_day
设置为上星期日。如果今天是星期日,这会将start_day
设置为今天。如果您希望“上周日”在一周前(如果当前是周日),请删除 % 7
。
【讨论】:
【参考方案6】:使用 timedeltas 和 datetime 模块:
import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())
【讨论】:
【参考方案7】:您可以使用 Natty。我试过 parsedatetime 和 dateparser。比较这三个,我认为 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
试试吧,它可以做得更多!
【讨论】:
【参考方案8】:d = datetime.datetime.today().weekday()
为您提供一周中的今天,从 0(星期一)到 6(星期日)计数
datetime.datetime.today() + datetime.timedelta(days=(7-d)%7)
(7-d)%7 给你几天前的星期一,或者如果今天是星期一,则让你留在原地
【讨论】:
以上是关于用 Python 查找星期一的日期的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL:查找指定日期前 7 天的日期,不包括星期日和其他特定日期