gpt4 book ai didi

Python:一个月中的周数

转载 作者:太空狗 更新时间:2023-10-29 20:36:10 24 4
gpt4 key购买 nike

指定日期时:

datetime.datetime(2011, 8, 15)

我怎么知道这是这个月的第三周?

如果我想要这个日期怎么办?

datetime.datetime(2011, 2, 28) //should return 4
datetime.datetime(2011, 8, 29) //should return 5

我知道如果给定的日期是闰年(bissextile),只有二月有 4 周

最佳答案

其他答案中显示的模数风格方法可能会产生误导。想象一年中的几周。在任何 365 天的一年中,有 52 个 7 天的 block ,还剩下一天。因此,如果我第一年的第 52 周在 12 月 30 日结束,我还有 12 月 31 日要担心。

我可以或者考虑一年中有 53 个星期,第 53 个星期是 12 月 31 日、1 月 1 日、1 月 2 日、1 月 3 日……或者,更传统地说,我认为明年的第一周实际上是从 12 月 31 日开始的。这就是您的日记袖珍本的做法。

当然,这意味着明年的第 52 周不是现在的 12 月 30 日,而是 12 月 29 日。每年它都会一点一点地倒退,直到第 6 年,我们将第 52 周的结束时间倒退了 6 天(并且为了更好的衡量标准而加入了一个闰日),所以 2017 年的整个第一周都是包含在 2016 年,那将是愚蠢的。所以 2016 年将有 53 周。

完全相同的逻辑适用于月份,但可能更难发现。不幸的是,您选择了 2011 年 8 月,它有一个巧妙的安排,即每月 1 号从星期一开始。

>>> print calendar.month(2011,8)
August 2011
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

>>> print calendar.month(2011,9)
September 2011
Mo Tu We Th Fr Sa Su
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

8 月 29 日在 8 月的第 5 周,但按照同样的逻辑,9 月 1 日、2 日、3 日和 4 日也将在 8 月的第 5 周,因此不能在 9 月的第 1 周。

所以 9 月 29 日,按照简单的天数除以 7 的方法,是在 9 月的第 5 周,但是看看上面的日历,如果 9 月 1-4 日是在 8 月,那么 9 月 29 日是在第 4 周九月。

这完全取决于您对一周何时开始的定义。

import datetime
import calendar

# I am assuming that the first week of a month starts with the first monday of a month...
#I *think* my logic is OK - if Monday (0) is the start of the week, then
#any dayof the month minus its own day of week (0,1,2...) must be positive
#if that day is on or after the first monday of the month

def week_of_month(tgtdate):

days_this_month = calendar.mdays[tgtdate.month]
for i in range(1, days_this_month):
d = datetime.date(tgtdate.year, tgtdate.month, i)
if d.day - d.weekday() > 0:
startdate = d
break
# now we canuse the modulo 7 appraoch
return (tgtdate - startdate).days //7 + 1

tgtdates = [datetime.date(2011, 8, 29),
datetime.date(2011, 8, 1)
]

for tgtdate in tgtdates:
print tgtdate,
print "is in week %s" % week_of_month(tgtdate)

print calendar.month(tgtdate.year,tgtdate.month)


# 2011-09-29 is in week 4
# 2011-09-01 is in week 0
# September 2011
# Mo Tu We Th Fr Sa Su
# 1 2 3 4
# 5 6 7 8 9 10 11
# 12 13 14 15 16 17 18
# 19 20 21 22 23 24 25
# 26 27 28 29 30

# 2011-08-29 is in week 5
# 2011-08-01 is in week 1
# August 2011
# Mo Tu We Th Fr Sa Su
# 1 2 3 4 5 6 7
# 8 9 10 11 12 13 14
# 15 16 17 18 19 20 21
# 22 23 24 25 26 27 28
# 29 30 31

以上,第 0 周表示该周不被视为本月的一部分。所以 9 月 1 日是 8 月的第 5 周。

注意

我想对@unutbu 的回答发表评论,但我想我没有足够的分数。模 7 方法在 2011 年 9 月失败。

>>> d = datetime.date(2011,9,28)
>>> (d.day-1)//7+1
4
>>> d = datetime.date(2011,9,1)
>>>
>>> (d.day-1)//7+1
1

从上面的日历来看,9 月 1 日在第一周,但这意味着 28 日不能在第 4 周 - 它必须在第 5 周,或者 1 日在第 0 周...

关于Python:一个月中的周数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7029261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com