Obtener fecha del número de semana

Resuelto Ali SAID OMAR asked hace 11 años • 8 respuestas

Por favor, ¿qué pasa con mi código?

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

Mostrar "2013-01-01 00:00:00", Gracias.

Ali SAID OMAR avatar Jun 13 '13 19:06 Ali SAID OMAR
Aceptado

Un número de semana no es suficiente para generar una fecha; También necesitas un día de la semana. Agregue un valor predeterminado:

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

El patrón -1y -%wle dice al analizador que elija el lunes de esa semana. Esto produce:

2013-07-01 00:00:00

%Wutiliza el lunes como primer día de la semana. Si bien puedes elegir tu propio día de la semana, puedes obtener resultados inesperados si te desvías de ese día.

Consulte la sección strftime()y strptime()comportamiento en la documentación, nota al pie 4:

Cuando se usan con el strptime()método, %Uy %Wsolo se usan en cálculos cuando se especifica el día de la semana y el año.

Tenga en cuenta que si su número de semana es una fecha de semana ISO , ¡querrá utilizarla %G-W%V-%uen su lugar! Esas directivas requieren Python 3.6 o posterior.

Martijn Pieters avatar Jun 13 '2013 12:06 Martijn Pieters

En Python 3.8 existe lo útil datetime.date.fromisocalendar:

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

En versiones anteriores de Python (3.7-), el cálculo puede utilizar la información de datetime.date.isocalendarpara calcular las semanas que cumplen con 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))

Ambos funcionan también con datetime.datetime.

Jens W. Klein avatar Dec 05 '2019 17:12 Jens W. Klein

Para completar las otras respuestas, si está utilizando números de semana ISO , esta cadena es apropiada (para obtener el lunes de un número de semana ISO determinado):

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

%G, %V, %uson equivalentes ISO de %Y, %W, %w, por lo que esto genera:

2013-06-24 00:00:00

Disponible en Python 3.6+; de documentos .

Luka Kikelj avatar Jan 04 '2019 04:01 Luka Kikelj
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res

Agregar 1 como día de la semana dará como resultado el inicio exacto de la semana actual. Agregar timedelta (días = 6) le dará el fin de semana.

datetime.datetime(2018, 7, 23)
Senthilkumar C avatar Jul 23 '2018 07:07 Senthilkumar C

Si alguien está buscando una función simple que devuelva todas las fechas de los días hábiles (lunes a viernes) de un número de semana, considere esto (según la respuesta aceptada )

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)

Producción:

['17.09.2021', '16.09.2021', '15.09.2021', '14.09.2021', '13.09.2021']
do-me avatar Sep 13 '2021 09:09 do-me