web-dev-qa-db-fra.com

Comment obtenir le numéro de semaine en Python?

Comment savoir quel numéro de semaine est l'année courante le 16 juin (semaine 24) avec Python?

288
Gerry

datetime.date a une méthode isocalendar(), qui renvoie un tuple contenant la semaine calendaire:

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

datetime.date.isocalendar () est une méthode-instance renvoyant un tuple contenant l'année, le numéro de semaine et le jour de la semaine dans l'ordre correspondant à l'instance de date donnée.

351
Horst Gutmann

Vous pouvez obtenir le numéro de semaine directement à partir de date-heure sous forme de chaîne.

>>> import datetime
>>> datetime.date(2010, 6, 16).strftime("%V")
'24'

Vous pouvez également obtenir différents "types" du numéro de semaine de l'année en modifiant le paramètre strftime pour:

%U - Numéro de semaine de l'année (dimanche en tant que premier jour de la semaine) sous la forme d'un nombre décimal complété à zéro. Tous les jours d'une nouvelle année précédant le premier dimanche sont considérés comme appartenant à la semaine 0. Exemples: 00 , 01,…, 53

%W - Numéro de semaine de l'année ( lundi comme premier jour de la semaine) sous forme de nombre décimal. Tous les jours d'une nouvelle année précédant le premier lundi sont considérés comme appartenant à la semaine 0. Exemples: 00 , 01,…, 53

[...]

( Ajouté dans Python 3.6, rétroporté sur certaines distributions Python 2.7 ) Plusieurs directives supplémentaires non requises par la norme C89 sont incluses pour plus de commodité. Ces paramètres correspondent tous aux valeurs de date ISO 8601. Celles-ci peuvent ne pas être disponibles sur toutes les plateformes si elles sont utilisées avec la méthode strftime().

[...]

%V - ISO 8601 semaine sous forme de nombre décimal avec lundi comme premier jour de la semaine. La semaine 01 est la semaine contenant le 4 janvier. Exemples: 01 , 02,…, 53

à partir de: date/heure - types de date et d'heure de base - Python documentation 3.7.

Je l'ai découvert depuis ici . Cela a fonctionné pour moi dans Python 2.7.6

88
jotacor

Je crois que date.isocalendar() sera la réponse. Cet article explique le calcul derrière le calendrier ISO 8601. Consultez la partie date.isocalendar () de la documentation page datetime de la documentation Python.

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

.isocalendar () retourne un 3-Tuple avec (year, wk num, wk day). dt.isocalendar()[0] renvoie 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 possible.

72
Byron Sommardahl

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

26
Bart Kiers

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

Si vous préférez utiliser une définition selon laquelle la semaine 1 est toujours du 1er au 7 janvier, quel que soit le jour de la semaine, utilisez une dérivation comme celle-ci:

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

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

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

Pour la valeur entière de la semaine instantanée de l'année, essayez:

import datetime
datetime.datetime.utcnow().isocalendar()[1]
12
user2099484

Si vous utilisez uniquement le numéro de semaine isocalendar, les éléments suivants devraient suffire:

import datetime
week = date(year=2014, month=1, day=1).isocalendar()[1]

Ceci récupère le deuxième membre du Tuple renvoyé par isocalendar pour notre numéro de semaine.

Cependant, si vous utilisez des fonctions de date faisant partie du calendrier grégorien, isocalendar seul ne fonctionnera pas! Prenons l'exemple suivant:

import datetime
date = datetime.datetime.strptime("2014-1-1", "%Y-%W-%w")
week = date.isocalendar()[1]

La chaîne ici dit de renvoyer le lundi de la première semaine de 2014 comme notre date. Lorsque nous utilisons isocalendar pour récupérer le numéro de semaine ici, nous nous attendons à recevoir le même numéro de semaine, mais ce n'est pas le cas. Au lieu de cela, nous obtenons un numéro de semaine de 2. Pourquoi?

La semaine 1 du calendrier grégorien est la première semaine contenant un lundi. La semaine 1 de l'isocalendar est la première semaine contenant un jeudi. La semaine partielle au début de l'année 2014 contient un jeudi. Il s'agit donc de la semaine 1 de l'isocalendar et de la prise date semaine 2.

Si nous voulons avoir la semaine grégorienne, nous devrons passer de l’isocalendar au grégorien. Voici une fonction simple qui fait l'affaire.

import datetime

def gregorian_week(date):
    # The isocalendar week for this date
    iso_week = date.isocalendar()[1]

    # The baseline Gregorian date for the beginning of our date's year
    base_greg = datetime.datetime.strptime('%d-1-1' % date.year, "%Y-%W-%w")

    # If the isocalendar week for this date is not 1, we need to 
    # decrement the iso_week by 1 to get the Gregorian week number
    return iso_week if base_greg.isocalendar()[1] == 1 else iso_week - 1
8
meesterguyperson
7
miles82

Vous pouvez essayer la directive% W comme ci-dessous:

d = datetime.datetime.strptime('2016-06-16','%Y-%m-%d')
print(datetime.datetime.strftime(d,'%W'))

'% W': numéro de semaine de l'année (le lundi en tant que premier jour de la semaine) sous forme décimale. Tous les jours d'une nouvelle année précédant le premier lundi sont considérés comme appartenant à la semaine 0. (00, 01, ..., 53)

6
Tung Nguyen

isocalendar () renvoie des valeurs d'année et de numéro de semaine incorrectes pour certaines dates:

Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime as dt
>>> myDateTime = dt.datetime.strptime("20141229T000000.000Z",'%Y%m%dT%H%M%S.%fZ')
>>> yr,weekNumber,weekDay = myDateTime.isocalendar()
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2015, weekNumber is 1

Comparez avec l'approche de Mark Ransom:

>>> yr = myDateTime.year
>>> weekNumber = ((myDateTime - dt.datetime(yr,1,1)).days/7) + 1
>>> print "Year is " + str(yr) + ", weekNumber is " + str(weekNumber)
Year is 2014, weekNumber is 52
2
Kevin

Je résume la discussion en deux étapes:

  1. Convertissez le format brut en objet datetime.
  2. Utilisez la fonction d'un objet datetime ou d'un objet date pour calculer le numéro de semaine.

Réchauffer

`` `python

from datetime import datetime, date, time
d = date(2005, 7, 14)
t = time(12, 30)
dt = datetime.combine(d, t)
print(dt)

`` `

1ère étape

Pour générer manuellement un objet datetime, nous pouvons utiliser datetime.datetime(2017,5,3) ou datetime.datetime.now().

Mais en réalité, nous avons généralement besoin d'analyser une chaîne existante. nous pouvons utiliser la fonction strptime, telle que datetime.strptime('2017-5-3','%Y-%m-%d') dans laquelle vous devez spécifier le format. Le détail du code de format différent peut être trouvé dans le documentation officielle .

Alternativement, un moyen plus pratique consiste à utiliser le module dateparse . Les exemples sont dateparser.parse('16 Jun 2010'), dateparser.parse('12/2/12') ou dateparser.parse('2017-5-3')

Les deux approches ci-dessus renverront un objet datetime.

2ème étape

Utilisez l'objet datetime obtenu pour appeler strptime(format). Par exemple,

`` `python

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object. This day is Sunday
print(dt.strftime("%W")) # '00' Monday as the 1st day of the week. All days in a new year preceding the 1st Monday are considered to be in week 0.
print(dt.strftime("%U")) # '01' Sunday as the 1st day of the week. All days in a new year preceding the 1st Sunday are considered to be in week 0.
print(dt.strftime("%V")) # '52' Monday as the 1st day of the week. Week 01 is the week containing Jan 4.

`` `

Il est très difficile de choisir le format à utiliser. Un meilleur moyen consiste à demander à un objet date d'appeler isocalendar(). Par exemple,

`` `python

dt = datetime.strptime('2017-01-1','%Y-%m-%d') # return a datetime object
d = dt.date() # convert to a date object. equivalent to d = date(2017,1,1), but date.strptime() don't have the parse function
year, week, weekday = d.isocalendar() 
print(year, week, weekday) # (2016,52,7) in the ISO standard

`` `

En réalité, vous aurez plus de chance d'utiliser date.isocalendar() pour préparer un rapport hebdomadaire, en particulier pendant la saison des achats "Noël-Nouvel An".

2
Yuchao Jiang

Il existe de nombreux systèmes pour la numérotation des semaines . Voici les systèmes les plus courants simplement avec des exemples de code:

  • ISO: La première semaine commence le lundi et doit contenir le 4 janvier. Le calendrier ISO est déjà implémenté en Python:

    >>> from datetime import date
    >>> date(2014, 12, 29).isocalendar()[:2]
    (2015, 1)
    
  • Amérique du Nord : la première semaine commence le dimanche et doit contenir le 1er janvier. Le code suivant correspond à ma version modifiée de l'implémentation du calendrier ISO de Python pour le système nord-américain:

    from datetime import date
    
    def week_from_date(date_object):
        date_ordinal = date_object.toordinal()
        year = date_object.year
        week = ((date_ordinal - _week1_start_ordinal(year)) // 7) + 1
        if week >= 52:
            if date_ordinal >= _week1_start_ordinal(year + 1):
                year += 1
                week = 1
        return year, week
    
    def _week1_start_ordinal(year):
        jan1 = date(year, 1, 1)
        jan1_ordinal = jan1.toordinal()
        jan1_weekday = jan1.weekday()
        week1_start_ordinal = jan1_ordinal - ((jan1_weekday + 1) % 7)
        return week1_start_ordinal
    
    >>> from datetime import date
    >>> week_from_date(date(2014, 12, 29))
    (2015, 1)
    
  • MMWR (CDC) : La première semaine commence le dimanche et doit contenir le 4 janvier. J'ai créé le package epiweeks spécifiquement pour ce système de numérotation. Voici un exemple:
    >>> from datetime import date
    >>> from epiweeks import Week
    >>> Week.fromdate(date(2014, 12, 29))
    (2014, 53)
    
0
dralshehri
userInput = input ("Please enter project deadline date (dd/mm/yyyy/): ")

import datetime

currentDate = datetime.datetime.today()

testVar = datetime.datetime.strptime(userInput ,"%d/%b/%Y").date()

remainDays = testVar - currentDate.date()

remainWeeks = (remainDays.days / 7.0) + 1


print ("Please pay attention for deadline of project X in days and weeks are  : " ,(remainDays) , "and" ,(remainWeeks) , "Weeks ,\nSo  hurryup.............!!!") 
0
Wael Abo Elhassan