我正在使用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
在这里猜错了。
答案 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.
我认为这是解决这些问题的最简单方法。