396 votes

Comment obtenir le numéro de semaine en Python ?

Comment trouver le numéro de la semaine du 16 juin de cette année (wk24) avec Python ?

1 votes

@Donal : L'un regarde le 16 juin, l'autre le 26 juin.

6 votes

Définir la semaine 1. isocalendar() n'est pas la seule façon de le faire.

4 votes

Notez que la sortie de strftime("%U", d) peut différer de la isocalendar() . Par exemple, si vous changez l'année en 2004, vous obtiendrez la semaine 24 en utilisant la méthode suivante strftime() et la semaine 25 en utilisant isocalendar() .

493voto

Horst Gutmann Points 3643

datetime.date a un isocalendar() qui renvoie un tuple contenant la semaine de calendrier :

>>> datetime.date(2010, 6, 16).isocalendar()[1]
24

datetime.date.isocalendar() est une méthode d'instance qui retourne un tuple contenant l'année, le numéro de semaine et le jour de semaine dans l'ordre respectif pour l'instance de date donnée.

12 votes

Il serait utile que vous expliquiez le [1] ou donner une indication sur l'endroit où trouver l'information.

7 votes

Je suppose que le plus simple est d'extraire le numéro de semaine en utilisant strftime, le mieux étant d'importer datetime today = datetime.now() week = today.strftime("%W")

9 votes

C'est un peu tard. Mais sur ma machine, date(2010, 1, 1).isocalendar()[1] renvoie à 53 . Extrait de la documentation : "Par exemple, 2004 commence un jeudi, donc la première semaine de l'année ISO 2004 commence le lundi 29 décembre 2003 et se termine le dimanche 4 janvier 2004, de sorte que date(2003, 12, 29).isocalendar() == (2004, 1, 1) et date(2004, 1, 4).isocalendar() == (2004, 1, 7) ."

81voto

Byron Sommardahl Points 4641

Je crois date.isocalendar() va être la réponse. Cet article explique les mathématiques derrière le calendrier ISO 8601. Jetez un coup d'œil à la partie date.isocalendar() de l'application page de temps de date de la documentation Python.

>>> dt = datetime.date(2010, 6, 16) 
>>> wk = dt.isocalendar()[1]
24

.isocalendar() retourne un 3-tuple avec (année, numéro de semaine, jour de semaine). dt.isocalendar()[0] retourne l'année, dt.isocalendar()[1] renvoie le numéro de la semaine, dt.isocalendar()[2] renvoie le jour de la semaine. Aussi simple que cela puisse paraître.

6 votes

+1 pour le lien qui explique la nature non-intuitive des semaines ISO.

31voto

Bart Kiers Points 79069

Voici une autre option :

import time
from time import gmtime, strftime
d = time.strptime("16 Jun 2010", "%d %b %Y")
print(strftime("%U", d))

qui imprime 24 .

Voir : http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior

11 votes

Ou %W si vos semaines commencent le lundi.

1 votes

Cette approche est meilleure dans les cas où vous ne voulez pas diviser ou convertir une date qui se présente sous la forme d'une chaîne... passez simplement la chaîne dans strptime au format chaîne telle quelle et spécifiez le format dans le second argument. Bonne solution. N'oubliez pas : %W si la semaine commence le lundi.

0 votes

Cela fonctionne pour moi ! J'avais des problèmes avec le datetime datetime.datetime(2019, 12, 30) en utilisant les réponses ci-dessus, ce qui m'a donné 1 mais cela donne la semaine correcte.

25voto

Mark Ransom Points 132545

La semaine ISO suggérée par d'autres est une bonne solution, mais elle pourrait ne pas répondre à vos besoins. Elle suppose que chaque semaine commence par un lundi, ce qui entraîne des anomalies intéressantes en début et en fin d'année.

Si vous préférez utiliser une définition qui dit que la semaine 1 est toujours du 1er janvier au 7 janvier, quel que soit le jour de la semaine, la voici.

>>> testdate=datetime.datetime(2010,6,16)
>>> print ((testdate - datetime.datetime(testdate.year,1,1)).days / 7) + 1
24

3 votes

Dire qu'isocalendar présente "quelques anomalies intéressantes" au début et à la fin de l'année semble être un euphémisme. Les résultats d'isocalendar sont très trompeurs (même s'ils ne sont pas réellement incorrects selon la spécification ISO) pour certaines valeurs de date, comme le 29 décembre 2014, 00:00:00, qui selon isocalendar a une valeur d'année de 2015 et un weekNumber de 1 (voir mon entrée ci-dessous).

3 votes

@Kevin, ce n'est pas faux, c'est juste que leurs définitions ne correspondent pas aux vôtres. L'ISO a décidé de deux choses : premièrement que la semaine entière du lundi au dimanche serait dans la même année, deuxièmement que l'année contenant la plupart des jours serait celle attribuée. Cela conduit à des jours de la semaine autour du début et de la fin de l'année qui se déplacent dans l'année adjacente.

8 votes

D'accord. Mais selon la définition de la plupart des gens, le 29 décembre 2014 ne sera certainement pas la première semaine de l'année 2015. Je voulais juste attirer l'attention sur cette source potentielle de confusion.

22voto

Chaggster Points 258

Généralement pour obtenir le numéro de la semaine en cours (commence le dimanche) :

from datetime import *
today = datetime.today()
print today.strftime("%U")

4 votes

Extrait de la documentation de strftime('%U') : "Numéro de semaine de l'année (le dimanche étant le premier jour de la semaine) sous forme de nombre décimal [00,53]. Tous les jours d'une nouvelle année précédant le premier dimanche sont considérés comme étant dans la semaine 0."

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