我有一些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的已知问题还是我错过了什么?
答案 0 :(得分:4)
有两种常见的星期编号系统,strptime()
有两个指令,用于处理ISO星期编号(%W
:星期从星期一开始)和北美使用的星期编号系统({ {1}}:几周从星期日开始。
我对后一个系统不是很熟悉,但是我认为Excel 2016是,当我检查时发现它同意在该系统中第51周的周日是12月16日。
%U
Wikipedia给出了确定北美系统第1周的方法,如下所示:第1周从星期日开始,包含1月1日和第一个星期六。或者,换一种说法,第1周在1月的第一个星期六结束。
因此,第1周的最多6天实际上可以落在上一年,而这些天也算在上一年的第53周。
此表连续7年显示该年第一个星期日的日期,在左边显示前一个星期日的日期。因此,第2列比第1列晚7天。Excel2016的=WEEKNUM(DATE(2018,12,16)) --> 51
函数将第2列中的所有日期报告为第2周:
WEEKNUM()
如果我在这些年的第1周的星期日向Python 2.7或3.7询问,如下所示:
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
我明白了
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")))
因此,对于Python标准库的02-Jan-2022
03-Jan-2016
04-Jan-2026
05-Jan-2020
06-Jan-2019
07-Jan-2018
01-Jan-2017
指令,第1周从1月的第一个星期日开始,而不是从第一个星期六结束。这是一种合理的方法,只是一种不同的方法。差异意味着%U
周数仅在1月1日为星期日的年份中与Excel周数一致。在所有其他年份中,包括您报告的2018年,%U
的周数将少一。
我将其报告为bugs.python.org的一个错误,问题35535。那里的共识似乎是当前行为与文档一致。 Python 2.3与Excel和Wikipedia一致,而Python 2.7与之不同,这似乎被认为没有说服力。
因此,如果不是以前的话,那么这现在是一个已知问题。