web-dev-qa-db-fra.com

Obtenir la date à partir du numéro de semaine ISO en Python

Duplicata possible:
Quelle est la meilleure façon de trouver l'inverse de datetime.isocalendar ()?

J'ai un numéro d'année et de semaine ISO 8601, et je dois le traduire à la date du premier jour de cette semaine (lundi). Comment puis-je faire ceci?

datetime.strptime () prend à la fois un %W et un %U directive, mais ni l'un ni l'autre ne respecte les règles de semaine ISO 8601 que datetime.isocalendar () utilise.

Mise à jour: Python 3.6 prend en charge le %G, %V et %u des directives également présentes dans libc, autorisant ce one-liner:

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

% W prend le premier lundi pour être dans la semaine 1 mais ISO définit la semaine 1 pour contenir le 4 janvier. Donc, le résultat de

datetime.strptime('2011221', '%Y%W%w')

est interrompu par un si le premier lundi et le 4 janvier sont dans des semaines différentes. C'est le cas si le 4 janvier est un vendredi, un samedi ou un dimanche. Donc, ce qui suit devrait fonctionner:

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
36

Avec le module isoweek vous pouvez le faire avec:

from isoweek import Week
d = Week(2011, 40).monday()
71
gisle