【问题标题】:strptime different output in python 2.7 compared to python 2.3 and Excel与 python 2.3 和 Excel 相比,python 2.7 中的 strptime 输出不同
【发布时间】:2018-12-18 08:17:29
【问题描述】:

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

【问题讨论】:

    标签: python strptime


    【解决方案1】:

    有两种常见的周编号系统,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 则不一致,这似乎被认为没有说服力。

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

    【讨论】:

    • OP 的日子不同了。
    • 感谢您对错误的详细而清晰的解释。除了找到使我的代码像以前一样工作的解决方法(Python 2.3)之外,我还想了解在 35535 问题的答案中对 glibc 的引用。
    • Paul Ganssle 对glibc 的引用是错误的。他说的是strftime(),而Python 的strftime() 确实依赖于C 库中strftime() 的底层实现。但是您的问题是关于 strptime() 并且正如 Python 文档所明确指出的那样:“strptime() 独立于任何平台”docs.python.org/3/library/time.html#module-time
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2015-12-24
    • 2016-08-22
    相关资源
    最近更新 更多