strptime 在 Python 2.7 中的输出与 Python 2.3 和 Excel 不同



我有一些python 2.3.4脚本要迁移到python 2.7.5,我在strptime的行为中发现了一个奇怪的问题。

脚本示例将(周数、日、年)格式的字符串转换为日期时间:

dw='51 0 18' # 51 week number , 0 for Sunday and 18 for year 2018 date=time.strptime(dw,"%U %w %y") print(date) python 2.3.4 中的输出:

(2018, 12, 16, 0, 0, 0, 6, 350, -1) # 2018 12 16

python 2.7.5 中的输出:

time.struct_time(tm_year=2018, tm_mon=12, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=357, tm_isdst=-1) # 2018 12 23

从一年中的第二周数字 (dw='2 0 18') 开始,行为就不同了。

这是 strptime 的已知问题还是我错过了什么?

有两种常见的周编号系统,strptime()有两个指令,用于处理 ISO 周数(%W:周从星期一开始)和北美使用的周数系统(%U:周从星期日开始)。

我对后一个系统不是很熟悉,但我认为Excel 2016是,当我检查时,我发现它同意在该系统中,2018年第51周的星期日是12月16日。

=WEEKNUM(DATE(2018,12,16))     --> 51

维基百科给出了确定北美系统中第 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

如果我在这些年第 1 周的星期日问 Python 2.7 或 3.7,就像这样:

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 和维基百科一致,而 Python 2.7 不同意,这似乎被认为是没有说服力的。

因此,如果不是以前,现在是一个已知问题。

最新更新