【发布时间】:2019-04-02 08:58:46
【问题描述】:
这是我的python代码
import datetime
a = datetime.datetime(2012, 1, 1)
print(a.isocalendar())
输出是
(2011, 52, 7)
输出的格式是一个元组,包含给定日期实例的相应顺序的年、周数和工作日。
为什么会这样?不应该是(2012, 1, 1),如果不是,我如何将其转换为绝对周数?
【问题讨论】:
这是我的python代码
import datetime
a = datetime.datetime(2012, 1, 1)
print(a.isocalendar())
输出是
(2011, 52, 7)
输出的格式是一个元组,包含给定日期实例的相应顺序的年、周数和工作日。
为什么会这样?不应该是(2012, 1, 1),如果不是,我如何将其转换为绝对周数?
【问题讨论】:
您似乎需要北美周数,而不是 ISO 周数。
>>> a = datetime.datetime(2012, 1, 1)
>>> a.strftime("%Y %U")
'2012 01'
【讨论】:
a = datetime.datetime(2021, 1, 1) a.strftime("%Y %U")它会输出2021 00
%U 指令做了你不期望的事情,而且描述了你做 期望的事情。这对每个人来说并不明显,但对你来说可能很明显。您获得 2021 年 1 月 1 日的第 0 周的原因是因为在该系统中,第 1 周是从一年中的第一个星期日(即 2021 年 1 月 3 日)开始的那一周,并且在第一周之前的所有日子星期日被视为在第 0 周(您可以选择将其视为上一年的第 53 周)。
根据documentation of isocalendar:
返回一个三元组,(ISO 年、ISO 周数、ISO 工作日)。
ISO 日历是公历的一种广泛使用的变体。请参阅https://www.staff.science.uu.nl/~gent0113/calendar/isocalendar.htm 以获得很好的解释。
ISO 年由 52 或 53 个整周组成,其中一周从星期一开始,到星期日结束。 ISO 年的第一周是包含星期四的一年中的第一个(公历)日历周。 这称为第 1 周,该星期四的 ISO 年与其公历年相同.
例如,2004 年从星期四开始,因此 ISO 2004 年的第一周从 2003 年 12 月 29 日星期一开始,到 2004 年 1 月 4 日星期日结束,因此 date(2003, 12, 29).isocalendar() == (2004, 1, 1) 和 date(2004, 1, 4).isocalendar() == (2004, 1, 7)。
在您的情况下,2012 年 1 月 1 日是星期日,因此根据 ISO 日历规则,2012 年的第一周是 1 月 2 日 - 1 月 8 日(因为第一个星期四是 1 月 5 日),而 1 月 1 日属于最后一个2011 年的一周。
【讨论】: