web-dev-qa-db-ja.com

ISOの週番号からPython

可能性のある複製:
datetime.isocalendar()の逆を見つけるための最良の方法は何ですか?

私はISO 8601の年と週の番号を持っています。これをその週の最初の日の日付(月曜日)に変換する必要があります。これどうやってするの?

datetime.strptime()%Wディレクティブと%Uディレクティブの両方を取りますが、ISO 8601の平日ルール datetime.isocalendar() には準拠していません=使用。

Update:Python 3.6 は、%G%Vおよび%uディレクティブもサポートしますlibcに存在し、このワンライナーを許可します:

>>> datetime.strptime('2011 22 1', '%G %V %u')
datetime.datetime(2011, 5, 30, 0, 0)
44

%Wは最初の月曜日を第1週と見なしますが、ISOは第1週を1月4日と定義しています。からの結果

datetime.strptime('2011221', '%Y%W%w')

最初の月曜日と1月4日が別の週にある場合を除いて、1つずれています。後者は、1月4日が金曜日、土曜日、または日曜日の場合です。したがって、以下が機能するはずです:

from datetime import datetime, timedelta, date
def tofirstdayinisoweek(year, week):
    ret = datetime.strptime('%04d-%02d-1' % (year, week), '%Y-%W-%w')
    if date(year, 1, 4).isoweekday() > 4:
        ret -= timedelta(days=7)
    return ret
36

isoweek module を使用すると、次のように実行できます。

from isoweek import Week
d = Week(2011, 40).monday()
71
gisle