160 votes

Obtenir la date à partir du numéro de semaine

S'il vous plaît, qu'est-ce qui ne va pas avec mon code :

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)

Affichez "2013-01-01 00:00:00", Merci.

284voto

Martijn Pieters Points 271458

Un numéro de semaine n'est pas suffisant pour générer une date ; il faut aussi un jour de la semaine. Ajoutez une valeur par défaut :

import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d + '-1', "%Y-W%W-%w")
print(r)

El -1 y -%w indique à l'analyseur syntaxique de choisir le lundi de cette semaine. Cela donne un résultat :

2013-07-01 00:00:00

%W utilise le lundi comme premier jour de la semaine. Bien que vous puissiez choisir votre propre jour de la semaine, vous risquez d'obtenir des résultats inattendus si vous vous en écartez.

Voir le strftime() y strptime() comportement dans la documentation, note de bas de page 4 :

Lorsqu'il est utilisé avec le strptime() méthode, %U y %W ne sont utilisés dans les calculs que lorsque le jour de la semaine et l'année sont spécifiés.

Remarque : si votre numéro de semaine est un Date de la semaine ISO vous devez utiliser %G-W%V-%u à la place ! Ces directives nécessitent Python 3.6 ou plus récent.

50voto

Jens W. Klein Points 31

Dans Python 3.8, il y a la pratique datetime.date.fromisocalendar :

>>> from datetime import date
>>> date.fromisocalendar(2020, 1, 1)  # (year, week, day of week)
datetime.date(2019, 12, 30, 0, 0)

Dans les anciennes versions de Python (3.7-), le calcul peut utiliser les informations provenant de datetime.date.isocalendar pour déterminer les semaines conformes à la norme ISO8601 :

from datetime import date, timedelta

def monday_of_calenderweek(year, week):
    first = date(year, 1, 1)
    base = 1 if first.isocalendar()[1] == 1 else 8
    return first + timedelta(days=base - first.isocalendar()[2] + 7 * (week - 1))

Les deux travaillent également avec datetime.datetime .

39voto

Luka Kikelj Points 481

Pour compléter les autres réponses - si vous utilisez ISO cette chaîne est appropriée (pour obtenir le lundi d'un numéro de semaine ISO donné) :

import datetime
d = '2013-W26'
r = datetime.datetime.strptime(d + '-1', '%G-W%V-%u')
print(r)

%G , %V , %u sont les équivalents ISO de %Y , %W , %w donc cette sortie :

2013-06-24 00:00:00

Disponible en Python 3.6+ ; à partir de docs .

7voto

Senthilkumar C Points 81
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

L'ajout de 1 comme jour de la semaine donnera le début exact de la semaine en cours. L'ajout de timedelta(days=6) vous donnera la fin de la semaine.

datetime.datetime(2018, 7, 23)

3voto

do-me Points 103

Si quelqu'un cherche une fonction simple qui renvoie toutes les dates des jours ouvrables (Lu-Ve) à partir d'un numéro de semaine, considérez ceci (basé sur réponse acceptée )

import datetime

def weeknum_to_dates(weeknum):
    return [datetime.datetime.strptime("2021-W"+ str(weeknum) + str(x), "%Y-W%W-%w").strftime('%d.%m.%Y') for x in range(-5,0)]

weeknum_to_dates(37)

Sortie :

['17.09.2021', '16.09.2021', '15.09.2021', '14.09.2021', '13.09.2021']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X