在Python中从ISO周数获取日期
可能重复的问题:
如何找到datetime.isocalendar()的反向操作?
我有一个ISO 8601格式的年份和周数,现在我需要把它转换成那一周的第一天的日期(星期一)。我该怎么做呢?
datetime.strptime()可以使用%W
和%U
这两个指令,但这两个指令并不符合ISO 8601的星期规则,而datetime.isocalendar()是遵循这些规则的。
更新: Python 3.6支持%G
、%V
和%u
这几个指令,这些指令在libc中也有,这样你就可以用一行代码来实现:
>>> from datetime import datetime
>>> datetime.strptime('2011 22 1', '%G %V %u')
datetime.datetime(2011, 5, 30, 0, 0)
更新 2: Python 3.8增加了fromisocalendar()
这个方法,更加直观易用:
>>> from datetime import datetime
>>> datetime.fromisocalendar(2011, 22, 1)
datetime.datetime(2011, 5, 30, 0, 0)
2 个回答
75
使用 isoweek模块,你可以这样做:
from isoweek import Week
d = Week(2011, 40).monday()
37
%W会把第一个星期一算作第一周,但ISO标准定义第一周必须包含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