Получить дату по номеру недели 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)

2 ответа

Решение

%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

С модулем isoweek вы можете сделать это с:

from isoweek import Week
d = Week(2011, 40).monday()
Другие вопросы по тегам