有两种常见的周编号系统,strptime() 有两个指令,用于处理 ISO 周编号(%W:周从星期一开始)和北美使用的周编号系统(%U:周周日开始)。
我对后一个系统不是很熟悉,但我认为 Excel 2016 是,当我检查时发现它同意在该系统中,2018 年第 51 周的星期日是 12 月 16 日。
=WEEKNUM(DATE(2018,12,16)) --> 51
Wikipedia 给出了在北美系统中确定第 1 周的方法如下:第 1 周从星期日开始,包含 1 月 1 日和第一个星期六。或者,换句话说,第 1 周在 1 月的第一个星期六结束。
因此,第 1 周的最多 6 天实际上可能在上一年,这些天也算作在上一年的第 53 周。
此表显示了 7 年期间一年中第一个星期日的日期,其左侧显示了前一个星期日的日期。所以第 2 列是第 1 列之后的 7 天。Excel 2016 的 WEEKNUM() 函数将第 2 列中的所有日期报告为第 2 周:
Sunday falls on Week 2 begins
--------------- -------------
26-Dec-2021 02-Jan-2022
27-Dec-2015 03-Jan-2016
28-Dec-2025 04-Jan-2026
29-Dec-2019 05-Jan-2020
30-Dec-2018 06-Jan-2019
31-Dec-2017 07-Jan-2018
01-Jan-2017 08-Jan-2017
如果我问 Python 2.7 或 3.7 这些年第 1 周的星期日,像这样:
for year in (2022,2016,2026,2020,2019,2018,2017):
print(time.strftime("%d-%b-%Y",time.strptime("{year} 1 0".format(year=year), "%Y %U %w")))
我明白了
02-Jan-2022
03-Jan-2016
04-Jan-2026
05-Jan-2020
06-Jan-2019
07-Jan-2018
01-Jan-2017
因此,对于 Python 标准库的 %U 指令,第 1 周从 1 月的第一个星期日开始,而不是在第一个星期六结束。这是一种合理的方法,只是一种不同的方法。差异意味着 %U 周数仅在 1 月 1 日为星期日的年份与 Excel 周数一致。在所有其他年份,包括您报告的 2018 年,%U 将给出一个少一周的数字。
我将此作为 bugs.python.org 上的错误报告,问题 35535。似乎一致认为当前行为与文档一致。 Python 2.3 与 Excel 和 Wikipedia 一致,而 Python 2.7 则不一致,这似乎被认为没有说服力。
所以,如果以前不是,现在它是一个已知问题。