¿Cómo saber qué número de semana es el año actual el 16 de junio (wk24) con Python?
python
datetime
week-number
Gerry
fuente
fuente
strftime("%U", d)
puede diferir de laisocalendar()
. Por ejemplo, si cambia el año a 2004, obtendría la semana 24 usandostrftime()
y la semana 25 usandoisocalendar()
.Respuestas:
datetime.date
tiene unisocalendar()
método, que devuelve una tupla que contiene la semana calendario: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.
fuente
[1]
', o le diera un puntero donde buscar la información.date(2010, 1, 1).isocalendar()[1]
vuelve53
. De los documentos: "Por ejemplo, 2004 comienza un jueves, por lo que la primera semana del año ISO 2004 comienza el lunes 29 de diciembre de 2003 y termina el domingo 4 de enero de 2004, así quedate(2003, 12, 29).isocalendar() == (2004, 1, 1)
ydate(2004, 1, 4).isocalendar() == (2004, 1, 7)
".isocalendar()
es genial, pero asegúrate de que sea lo que quieres. Hoy es un ejemplo perfecto. 01/01/2016 es igual a(2015, 53, 5)
.now.strftime("%W")
ynow.strftime("%U")
son iguales a lo00
que a menudo es lo que se quiere. Ejemplos de STRFTIMEPuede obtener el número de semana directamente de datetime como cadena.
También puede obtener diferentes "tipos" del número de semana del año cambiando el
strftime
parámetro para:Me enteré de esto desde aquí . Funcionó para mí en Python 2.7.6
fuente
Invalid format string
a este patrón. Sus documentos tampoco mencionan%V
.%G-%V
lugar de%Y-%V
.%G
es el equivalente en años ISO de%Y
Creo que
date.isocalendar()
va a 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..isocalendar () devuelve una tupla de 3 con (año, número de semana, día de semana).
dt.isocalendar()[0]
devuelve el año,dt.isocalendar()[1]
devuelve el número de semana,dt.isocalendar()[2]
devuelve el día de la semana. Tan simple como puede ser.fuente
Aquí hay otra opción:
que imprime
24
.Ver: http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior
fuente
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 comienzo y al final del año.
Si prefiere usar una definición que dice 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:
fuente
Generalmente para obtener el número de semana actual (comienza el domingo):
fuente
Para el valor entero de la semana instantánea del año, intente:
fuente
Hay muchos sistemas para la numeración de semanas . Los siguientes son los sistemas más comunes simplemente puestos con ejemplos de código:
ISO : La primera semana comienza con el lunes y debe contener el 4 de enero. El calendario ISO ya está implementado en Python:
Norteamérica : la primera semana comienza con el domingo y debe contener el 1 de enero. El siguiente código es mi versión modificada de la implementación del calendario ISO de Python para el sistema norteamericano:
fuente
Si solo usa el número de semana isocalendario en todos los ámbitos, lo siguiente debería ser suficiente:
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 en el calendario gregoriano, ¡isocalendar solo no funcionará! Tome el siguiente ejemplo:
La cadena aquí dice que regrese el lunes de la primera semana de 2014 como nuestra fecha. Cuando usamos isocalendar para recuperar el número de semana aquí, esperaríamos recuperar el mismo número de semana, pero no lo hacemos. En cambio, tenemos un número semanal de 2. ¿Por qué?
La semana 1 en el calendario gregoriano es la primera semana que contiene un lunes. La semana 1 en el isocalendario es la primera semana que contiene un jueves. La semana parcial a principios de 2014 contiene un jueves, por lo que esta es la semana 1 por el isocalendario y hace la
date
semana 2.Si queremos obtener la semana gregoriana, tendremos que convertir del isocalendario al gregoriano. Aquí hay una función simple que hace el truco.
fuente
Puede probar la directiva% W de la siguiente manera:
'% W': número de 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)
fuente
isocalendar () devuelve valores incorrectos de año y número de semana para algunas fechas:
Compárese con el enfoque de Mark Ransom:
fuente
Resumo la discusión en dos pasos:
datetime
objeto.datetime
objeto o undate
objeto para calcular el número de semana.Calentar
`` `pitón
`` `
1er paso
Para generar un
datetime
objeto manualmente , podemos usardatetime.datetime(2017,5,3)
odatetime.datetime.now()
.Pero en realidad, generalmente necesitamos analizar una cadena existente. podemos usar la
strptime
función, comodatetime.strptime('2017-5-3','%Y-%m-%d')
en la que debe especificar el formato. Se pueden encontrar detalles de diferentes formatos en la documentación oficial .Alternativamente, una forma más conveniente es usar el módulo dateparse . Ejemplos son
dateparser.parse('16 Jun 2010')
,dateparser.parse('12/2/12')
odateparser.parse('2017-5-3')
Los dos enfoques anteriores devolverán un
datetime
objeto.2do paso
Usa el
datetime
objeto obtenido para llamarstrptime(format)
. Por ejemplo,`` `pitón
`` `
Es muy difícil decidir qué formato usar. Una mejor manera es obtener un
date
objeto para llamarisocalendar()
. Por ejemplo,`` `pitón
`` `
En realidad, será más probable que lo use
date.isocalendar()
para preparar un informe semanal, especialmente en la temporada de compras "Navidad-Año Nuevo".fuente
fuente
Se han dado muchas respuestas, pero me gustaría agregarlas.
Si necesita que la semana se muestre como un estilo año / semana (por ejemplo, 1953 - semana 53 de 2019, 2001 - semana 1 de 2020, etc.), puede hacer esto:
Tomará el año y la semana actuales, y long_week_num en el día de la escritura será:
fuente
date()
desde cero?datetime.datetime()
las instancias tienen un.date()
método para ese trabajo.