从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周中做了很多操作的话。