从Python中的ISO周数获取日期

从Python中的ISO周数获取日期,python,iso,week-number,Python,Iso,Week Number,可能重复: 我有一个ISO 8601年和周编号,我需要将其转换为该周第一天(星期一)的日期。我该怎么做 接受%W和%U指令,但两者都不遵守使用的ISO 8601工作日规则 更新:支持libc中也存在的%G、%V和%u指令,允许这一行: >>> datetime.strptime('2011 22 1', '%G %V %u') datetime.datetime(2011, 5, 30, 0, 0) 更新2:添加了fromisocalendar()方法,该方法更加直观: &

可能重复:

我有一个ISO 8601年和周编号,我需要将其转换为该周第一天(星期一)的日期。我该怎么做

接受
%W
%U
指令,但两者都不遵守使用的ISO 8601工作日规则

更新:支持libc中也存在的
%G
%V
%u
指令,允许这一行:

>>> datetime.strptime('2011 22 1', '%G %V %u')
datetime.datetime(2011, 5, 30, 0, 0)
更新2:添加了
fromisocalendar()
方法,该方法更加直观:

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

%W将第一个星期一定为第1周,但ISO将第1周定义为包含1月4日。那么结果是什么呢

datetime.strptime('2011221', '%Y%W%w')
第一个星期一和1月4日是不同的星期。 如果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
使用,您可以使用:

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

为什么不优雅呢?你可以通过谷歌找到的其他选项甚至更难看。我发现了一个相关的问题,并给出了一个很好的答案:我看到在PHP strftime()和libc strptime()中提到了%V指令,但显然Python没有实现它。我在上面发布的链接中使用了这个解决方案。这绝对是最实用的方法,尤其是如果你在ISO周中做了很多操作的话。