Por favor, ¿qué pasa con mi código?
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Muestra "2013-01-01 00:00:00", Gracias.
Por favor, ¿qué pasa con mi código?
import datetime
d = "2013-W26"
r = datetime.datetime.strptime(d, "%Y-W%W")
print(r)
Muestra "2013-01-01 00:00:00", Gracias.
Respuestas:
Un número de semana no es suficiente para generar una fecha; también necesitas un día de la semana. Agregar 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 puede elegir su propio día de la semana, es posible que obtenga resultados inesperados si se desvía de ese.
Consulte la sección de comportamiento strftime()
ystrptime()
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 especifican 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á usarla %G-W%V-%u
en su lugar! Esas directivas requieren Python 3.6 o más reciente.
if d.endswith('-W0') and r.day == 7: raise ValueError('Invalid date string, No week 0 in {}'.format(r.year))
%G
(año durante la mayor parte de la semana) y %V
en ese caso.
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 dado):
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
, así que esto salidas:
2013-06-24 00:00:00
Disponible en Python 3.6+; de docs .
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 usar la información de datetime.date.isocalendar
para calcular la semana que cumple con la norma 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
.
import datetime
res = datetime.datetime.strptime("2018 W30 w1", "%Y %W w%w")
print res
Agregar 1 como día de la semana producirá el inicio exacto de la semana actual. La adición de timedelta (días = 6) le dará el fin de semana.
datetime.datetime(2018, 7, 23)
res = datetime.datetime.strptime("2018 W30 w1", "%Y W%W w%w")
En caso de que tenga el número anual de semanas, simplemente agregue el número de semanas al primer día del año.
>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> week = 40
>>> year = 2019
>>> date = datetime.date(year,1,1)+relativedelta(weeks=+week)
>>> date
datetime.date(2019, 10, 8)
Aquí hay una función útil que incluye el problema con la semana cero.