52

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

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

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

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

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

更新 2 : Python 3.8fromisocalendar()では、さらに直感的なメソッドが追加されました。

>>> datetime.fromisocalendar(2011, 22, 1)
datetime.datetime(2011, 5, 30, 0, 0)
4

2 に答える 2

75

isoweek モジュールを使用すると、次のように実行できます。

from isoweek import Week
d = Week(2011, 40).monday()
于 2011-10-07T12:15:20.530 に答える
37

%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
于 2011-05-04T13:16:34.950 に答える