Obtener fecha del número de semana
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.
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 -1
y -%w
le dice al analizador que elija el lunes de esa semana. Esto produce:
2013-07-01 00:00:00
%W
utiliza 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,%U
y%W
solo 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-%u
en su lugar! Esas directivas requieren Python 3.6 o posterior.
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.isocalendar
para 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
.
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
, %u
son equivalentes ISO de %Y
, %W
, %w
, por lo que esto genera:
2013-06-24 00:00:00
Disponible en Python 3.6+; de documentos .
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)
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']