2016-07-29 11 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'を返します。

これは既知の問題ですか?既知の回避策はありますか?それはおそらくここで間違って推測さstrptimeですので

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

は、(2016, 1, 7)が得られますことを

注意。月曜日を含む最初の週は、週の最初の日は、最後の1の%wの日数を持って月曜日、ある週として1

を数えて

答えて

1

% Wは、年の週です曜日は0である日曜日です。したがって、この計算では、%Y-%W-0は常に%Y-%W-1より6日後に来ます。

この計算により、52週目は12月28日に開始し、日曜日は含まれません。したがって、2015-W52-0は2016年(1月3日)の最初の日曜日と解釈されます。これは最初の月曜日の前であるため、2015-W52-0は正式に2016-W00-0であり、2015-W53-0は2016年の第2日曜日であり、週1の終わり、すなわち1月10日または2016-W01です-0。

したがって、方法はdocumentedとして機能します。

%Wと%wは、ISO week week dateアルゴリズムを実装していません。これは、木曜日を含むものとして最初の週を設定します。 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 dateの'%G'と '%V'をサポートしていないことは残念です。* James K *(少なくともPython 3.5.2ではない)に言及しています。 – JeroenHoek

関連する問題