python datetime

En Python, ¿cómo encuentro la fecha del primer lunes de una semana determinada?



title in python plot (6)

Si tengo un determinado número de semana (por ejemplo, 51) y un año determinado (por ejemplo, 2008), ¿cómo puedo encontrar la fecha del primer lunes de esa misma semana?

Muchas gracias


Esto parece funcionar, asumiendo que la semana uno puede tener un lunes cayendo en un día en el último año.

from datetime import date, timedelta def get_first_dow(year, week): d = date(year, 1, 1) d = d - timedelta(d.weekday()) dlt = timedelta(days = (week - 1) * 7) return d + dlt


Use el formato de cadena encontrado en el módulo de tiempo. Explicación detallada de los formatos utilizados

>>> import time >>> time.strptime("51 08 1","%U %y %w") (2008, 12, 22, 0, 0, 0, 0, 357, -1)

La fecha devuelta está desactivada por una semana de acuerdo con el calendario en mi computadora, ¿quizás es porque las semanas están indexadas desde 0?


>>> import time >>> time.asctime(time.strptime(''2008 50 1'', ''%Y %W %w'')) ''Mon Dec 15 00:00:00 2008''

Suponiendo que el primer día de la semana es el lunes, use %U lugar de %W si el primer día de la semana es el domingo. Vea la documentación de strptime para más detalles.

Actualización: número de semana fijo. La directiva %W está basada en 0, por lo que la semana 51 se ingresaría como 50, no como 51.


Las soluciones de PEZ y Gerald Kaszuba funcionan bajo el supuesto de que el 1 de enero siempre será en la primera semana de un año determinado. Esta suposición no es correcta para el calendario ISO; consulte los documentos de Python para referencia. Por ejemplo, en el calendario ISO, la semana 1 de 2010 en realidad comienza el 4 de enero y el 1 de enero de 2010 está en la semana 53 de 2009. Una solución compatible con el calendario ISO:

from datetime import date, timedelta def week_start_date(year, week): d = date(year, 1, 1) delta_days = d.isoweekday() - 1 delta_weeks = week if year == d.isocalendar()[0]: delta_weeks -= 1 delta = timedelta(days=-delta_days, weeks=delta_weeks) return d + delta


Modifiqué ligeramente el guión de Vaidas K. de una manera en que devolverá el comienzo de la semana y el final del día de la semana.

from datetime import datetime, date, timedelta def weekbegend(year, week): """ Calcul du premier et du dernier jour de la semaine ISO """ d = date(year, 1, 1) delta_days = d.isoweekday() - 1 delta_weeks = week if year == d.isocalendar()[0]: delta_weeks -= 1 # delta for the beginning of the week delta = timedelta(days=-delta_days, weeks=delta_weeks) weekbeg = d + delta # delta2 for the end of the week delta2 = timedelta(days=6-delta_days, weeks=delta_weeks) weekend = d + delta2 return weekbeg, weekend

Soyou puede usarlo de esa manera.

weekbeg, weekend = weekbegend(2009, 1) begweek = weekbeg.strftime("%A %d %B %Y") endweek = weekend.strftime("%A %d %B %Y")


from datetime import date, timedelta def first_monday(year, week): d = date(year, 1, 4) # The Jan 4th must be in week 1 according to ISO return d + timedelta(weeks=(week-1), days=-d.weekday())