Python的'datetime.strptime`越野车是否有53周的周数?

时间:2016-07-29 06:29:03

标签: python-2.7 python-datetime

我正在使用Python 2.7,我正在尝试将周数转换为实际日期。

我正在使用this解决方案,该解决方案在基础测试中运行良好,但我发现了一个似乎有休息的情况:在53周的数年内。

以下示例显示了问题:

datetime.datetime.strptime( "2015-W53-0", "%Y-W%W-%w").strftime("%Y-W%W-%w")

这会返回'2016-W01-0',我认为这没有用。

这是一个已知的问题,是否有已知的解决方法?

请注意:

datetime.datetime.strptime( "2015-W53-0", "%Y-W%W-%w").isocalendar()

产生(2016, 1, 7),所以可能strptime在这里猜错了。

2 个答案:

答案 0 :(得分:1)

%W是一年中的一周,包含星期一的第一周计为第1周。

一周的第一天是星期一,其%天数为1.星期的最后一天是星期日,其天数为0.所以在这个估算中%Y-%W-0总是比%Y-%W-1晚六天。

通过这个计算,第52周开始于12月28日,并且不包含星期天。所以2015-W52-0被解释为2016年(1月3日)的第一个星期天。由于这是在第一个星期一之前,2015-W52-0规范2016-W00-0和2015-W53-0是2016年的第二个星期日,即第1周结束,即1月10日,或2016-W01 -0。

因此这些方法的工作方式为documented

%W和%w没有实现ISO周日期算法,该算法将第一周设置为包含星期四的算法。 2015年ISO方法包含第53周,但不包含%W方法。如果要使用ISO周期,则应使用isocalendar

由于python的标准实现只是调用C库函数,因此您可以根据ISO算法使用%G(年份)和%V(周数)。但这些不能保证便携。

答案 1 :(得分:1)

我实际上找到了一个名为isoweek的好库,它可以正常运行。

#This is Week 53 of 2015 according to ISO
week = isoweek.Week.withdate( datetime.date( 2016,1,1) )
monday = week.monday()
print monday.isocalendar()
#Prints (2015, 53, 1), which is correct.

我认为这是解决这些问题的最简单方法。