52

可能重复:
找到 datetime.isocalendar() 的倒数的最佳方法是什么?

我有一个 ISO 8601 年和周编号,我需要将其转换为该周(星期一)第一天的日期。我怎样才能做到这一点?

datetime.strptime()接受 a%W和一个%U指令,但都不遵守datetime.isocalendar()使用的 ISO 8601 工作日规则。

更新: Python 3.6支持 libc 中也存在的%G,%V%u指令,从而允许这种单行:

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

更新 2Python 3.8添加了该fromisocalendar()方法,更加直观:

>>> 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 月 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 回答