与python 2.3和Excel相比,python 2.7中的strptime输出不同

时间:2018-12-18 08:17:29

标签: python strptime

我有一些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的已知问题还是我错过了什么?

1 个答案:

答案 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与之不同,这似乎被认为没有说服力。

因此,如果不是以前的话,那么这现在是一个已知问题。