2016-07-29 68 views
1

我正在使用Python 2.7,我试图将周数转换为实际日期。Python的`datetime.strptime`在53周的数周内有多少次?

我正在使用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这是猜测错在这里。

回答

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

我实际上找到了一个名为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. 

我认为这是处理这些问题最简单的方法。

+0

这工作,感谢张贴的解决方案。你可能会接受你自己的回答。很遗憾'strptime'不支持ISO日期的'%G'和'%V' * James K *提到(至少在Python 3.5.2中不提供)。 – JeroenHoek