2016-07-29 62 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