¿Cómo obtener el número de semana en Python?

¿Cómo saber qué número de semana es el año actual el 16 de junio (semana 24) con Python?

datetime.date tiene un método isocalendar() , que devuelve una tupla que contiene la semana del calendario:

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

datetime.date.isocalendar () es un método de instancia que devuelve una tupla que contiene año, número de semana y día de la semana en el orden respectivo para la instancia de fecha dada.

Puede obtener el número de la semana directamente de datetime como cadena.

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

También puede obtener diferentes “tipos” del número de la semana del año cambiando el parámetro strftime para:

% U: número de la semana del año en curso, que comienza con el primer domingo como primer día de la primera semana.

% V: el número de semana ISO 8601 del año en curso (01 a 53), donde la semana 1 es la primera semana que tiene al menos 4 días en el año en curso y con el lunes como primer día de la semana.

% W: número de la semana del año en curso, comenzando con el primer lunes como primer día de la primera semana.

Lo tengo desde aquí . Funcionó para mí en Python 2.7.6

Creo que date.isocalendar() será la respuesta. Este artículo explica las matemáticas detrás del calendario ISO 8601. Consulte la parte date.isocalendar () de la página datetime de la documentación de Python.

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

.isocalendar () devuelve una tupla de 3 con (año, wk num, wk day). dt.isocalendar()[0] devuelve el año, dt.isocalendar()[1] devuelve el número de la semana, dt.isocalendar()[2] devuelve el día de la semana. Simple como puede ser.

Aquí hay otra opción:

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

que imprime 24 .

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

Generalmente para obtener el número de la semana actual (comienza desde el domingo):

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

La semana ISO sugerida por otros es buena, pero puede que no se ajuste a sus necesidades. Se supone que cada semana comienza con un lunes, lo que lleva a algunas anomalías interesantes al principio y al final del año.

Si prefiere usar una definición que diga que la semana 1 es siempre del 1 de enero al 7 de enero, independientemente del día de la semana, use una derivación como esta:

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

Para el valor entero de la semana instantánea del año, intente:

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

Si solo está utilizando el número de semana de isocalendar en todos los ámbitos, lo siguiente debería ser suficiente:

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

Esto recupera el segundo miembro de la tupla devuelto por isocalendar para nuestro número de semana.

Sin embargo, si va a utilizar funciones de fecha que se ocupan del calendario gregoriano, ¡isocalendar solo no funcionará! Tomemos el siguiente ejemplo:

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

La cadena aquí dice que se debe devolver el lunes de la primera semana de 2014 como nuestra fecha. Cuando usamos isocalendar para recuperar el número de la semana aquí, esperamos recuperar el mismo número de la semana, pero no lo hacemos. En cambio, obtenemos una semana de 2. ¿Por qué?

La semana 1 en el calendario gregoriano es la primera semana que contiene un lunes. La semana 1 en el isocalendar es la primera semana que contiene un jueves. La semana parcial de principios de 2014 contiene un jueves, por lo que esta es la semana 1 del isocalendar, y hace date semana 2.

Si queremos obtener la semana gregoriana, tendremos que convertir el isocalendar al gregoriano. Aquí hay una función simple que hace el truco.

 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 

Puede probar la directiva% W de la siguiente manera:

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

‘% W’: número de la semana del año (lunes como primer día de la semana) como un número decimal. Todos los días en un nuevo año anterior al primer lunes se consideran en la semana 0. (00, 01, …, 53)

Mira datetime.datetime.isocalendar .

isocalendar () devuelve valores de año y semana incorrectos para algunas fechas:

 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 

Compare con el enfoque 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 

Resumo la discusión a dos pasos:

  1. Convertir el formato en bruto a un objeto de datetime y datetime .
  2. Utilice la función de un objeto de datetime y datetime o un objeto de date para calcular el número de la semana.

Calentar

“ `python

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

“ `

1er paso

Para generar manualmente un objeto datetime , podemos usar datetime.datetime(2017,5,3) o datetime.datetime.now() .

Pero en realidad, normalmente necesitamos analizar una cadena existente. podemos usar la función strptime , como datetime.strptime('2017-5-3','%Y-%m-%d') en la que tiene que especificar el formato. El detalle del código de formato diferente se puede encontrar en la documentación oficial .

Alternativamente, una forma más conveniente es usar el módulo dateparse . Los ejemplos son dateparser.parse('16 Jun 2010') , dateparser.parse('12/2/12') dateparser.parse('2017-5-3') dateparser.parse('12/2/12') o dateparser.parse('2017-5-3')

Los dos enfoques anteriores devolverán un objeto de datetime y datetime .

2do paso

Utilice el objeto datetime obtenido para llamar a strptime(format) . Por ejemplo,

“ `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. 

“ `

Es muy difícil decidir qué formato usar. Una mejor manera es obtener un objeto de date para llamar a isocalendar() . Por ejemplo,

“ `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 realidad, será más probable que use date.isocalendar() para preparar un informe semanal, especialmente en la temporada de compras “Navidad-Año Nuevo”.

 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.............!!!")