Получить дату с номера недели ISO в Python
Возможный дубликат:
Каков наилучший способ найти обратное к datetime.isocalendar()?
У меня есть номер ISO 8601 и номер недели, и мне нужно перевести это на дату первого дня на этой неделе (понедельник). Как я могу это сделать?
datetime.strptime() принимает директивы %W
и %U
, но не соблюдает правила дня недели ISO 8601 что datetime.isocalendar() использовать.
Обновление: Python 3.6 поддерживает директивы %G
, %V
и %U
в libc, позволяя этому одностроку:
>>> datetime.strptime('2011 22 1', '%G %V %u')
datetime.datetime(2011, 5, 30, 0, 0)
Ответы
Ответ 1
% W берет первый понедельник на неделю 1, но ISO определяет неделю 1, чтобы содержать 4 января. Таким образом, результат
datetime.strptime('2011221', '%Y%W%w')
отключается одним, если первый понедельник и 4 января находятся в разные недели.
Последнее относится к случаю, если 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
Ответ 2
С isoweek module вы можете сделать это с помощью
from isoweek import Week
d = Week(2011, 40).monday()