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

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

Muchas gracias

>>> 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 su semana sea el lunes, use %U lugar de %W si el primer día de su semana es el domingo. Consulte la documentación para strptime para más detalles.

Actualización: Número de semana fijo. La directiva %W se basa 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 la documentación de Python para referencia. Por ejemplo, en el calendario ISO, la semana 1 de 2010 comienza realmente el 4 de enero, y el 1 de enero de 2010 es 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 
 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()) 

Esto parece funcionar, suponiendo 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 

He modificado ligeramente el guión de Vaidas K. de manera que regrese el principio de la semana y el último 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 

Soy tu lo puedes usar de esa manera.

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

Utilice el formato de cadena que se encuentra 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 de devolución está desactivada por una semana según el calendario en mi computadora, tal vez porque las semanas se indexan desde 0?