在Python中从ISO周数获取日期

53 投票
2 回答
38916 浏览
提问于 2025-04-16 16:58

可能重复的问题:
如何找到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

撰写回答