¿Cómo obtener todas las instancias de fecha y hora de la semana actual, dado un día?

Dado un día, quiero obtener todos los días (instancias de fecha y hora) de la semana en que el día está presente.

Tengo una solución, corríjame si hay algún error o si existe un método más eficiente.

>>> import datetime >>> today = datetime.datetime(2013, 06, 26) >>> today datetime.datetime(2013, 6, 26, 0, 0) >>> day_of_week = today.isocalendar()[2] - 1 >>> day_of_week 2 >>> start_date = today - timedelta(days=day_of_week) >>> start_date datetime.datetime(2013, 6, 24, 0, 0) # Got monday >>> dates = [start + timedelta(days=i) for i in range(7)] >>> dates [datetime.datetime(2013, 6, 24, 0, 0), datetime.datetime(2013, 6, 25, 0, 0), datetime.datetime(2013, 6, 26, 0, 0), datetime.datetime(2013, 6, 27, 0, 0), datetime.datetime(2013, 6, 28, 0, 0), datetime.datetime(2013, 6, 29, 0, 0), datetime.datetime(2013, 6, 30, 0, 0)] 

Quiero que lunes sea la fecha de inicio y el domingo la fecha de finalización.

datetime.date() para dejar claro que estamos calculando fechas aquí, y use date.weekday() para obtener el día de la semana actual en lugar de usar la llamada .isocalendar() , lo que nos da un número de día de la semana basado en 0 (0 es lunes).

 import datetime today = datetime.date(2013, 06, 26) dates = [today + datetime.timedelta(days=i) for i in range(0 - today.weekday(), 7 - today.weekday())] 

Manifestación:

 >>> from pprint import pprint >>> import datetime >>> today = datetime.date(2013, 06, 26) >>> pprint([today + datetime.timedelta(days=i) for i in range(0 - today.weekday(), 7 - today.weekday())]) [datetime.date(2013, 6, 24), datetime.date(2013, 6, 25), datetime.date(2013, 6, 26), datetime.date(2013, 6, 27), datetime.date(2013, 6, 28), datetime.date(2013, 6, 29), datetime.date(2013, 6, 30)] 

En python 2 puedes reemplazar range() con xrange() si quieres; por un valor de 7 días que no hará mucha diferencia.

Solo para hacerlo explícito; datetime.weekday() existe, y existe un .isoweekday() , por lo que no es necesario utilizar .isocalendar() ningún lugar.