2009-10-25 29 views
40

¿Cómo encuentro la fecha del lunes anterior, basada en la fecha actual usando Python? Pensé que tal vez podría usar: datetime.weekday() para hacerlo, pero me estoy atascado.Buscar la fecha del lunes con Python

Básicamente quiero encontrar la fecha de hoy y la fecha de los lunes para construir una consulta de rango de fechas en django usando: created__range=(start_date, end_date).

+0

¿Vienes el lunes o el lunes pasado? –

+0

Estaba buscando el pasado lunes – Joe

Respuesta

106
>>> import datetime 
>>> today = datetime.date.today() 
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1) 
datetime.date(2009, 10, 26) 

Algunas palabras de explicación:

Tome la fecha de hoy. Resta la cantidad de días que ya pasaron esta semana (esto te da 'el último' lunes). Agrega una semana.

Editar: Lo anterior es para 'el próximo lunes', pero ya que estabas buscando 'el pasado lunes' se podría utilizar

today - datetime.timedelta(days=today.weekday()) 
+4

Python es increíble :) Esto es difícil y no trivial en la mayoría de los otros idiomas. –

+0

No responde realmente la pregunta que fue para el último lunes no el lunes siguiente –

+2

@GeraldKaszuba en realidad es mucho más fácil y más legible en PHP: 'new DateTime (" el último lunes ")' o 'strtotime (" el último lunes ")'. – JustAC0der

0

Usando timedeltas y módulo de fecha y hora:

import datetime 
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday()) 
0
d = datetime.datetime.today().weekday() 

te da el día de hoy de la semana, contando 0 (lunes) a 6 (domingo)

datetime.datetime.today() + datetime.timedelta(days=(7-d)%7) 

(7-d)% 7 le da días hasta el lunes, o te deja donde se encuentre, si hoy es lunes

8

Nota: El PO dice en los comentarios, "que estaba buscando el pasado Lunes ". Considero que esto significa que estamos buscando el último lunes que ocurrió estrictamente antes de hoy.

El cálculo es un poco difícil de realizar correctamente utilizando solo el módulo datetime (especialmente teniendo en cuenta la interpretación anterior del "pasado lunes" y si desea evitar cliché if-statements). Por ejemplo, si today es un lunes como 2013-12-23,

today - DT.timedelta(days=today.weekday()) 

rendimientos 2013-12-23, que es el mismo día que today (no el pasado lunes).

La ventaja de usar el dateutil module es que no tiene que hacer cálculos mentales complicados ni forzar al lector a hacer lo mismo para obtener la fecha correcta. dateutil lo hace todo por usted:

import dateutil.relativedelta as rdelta 
import datetime as DT 

today = DT.date(2013, 12, 23) # Monday 

past_monday = today + rdelta.relativedelta(days=-1, weekday=rdelta.MO(-1)) 
print(past_monday) 
# 2013-12-16 

next_monday = today + rdelta.relativedelta(days=1, weekday=rdelta.MO(+1)) 
print(next_monday) 
# 2013-12-30 

Tenga en cuenta que se necesita para garantizar que days=-1past_monday es un día diferente que today.

+0

Usted está usando la herramienta fácil por el camino difícil;) – diegueus9

32

La publicación de ChristopheD está cerca de lo que quieres.No tengo representante suficiente para hacer un comentario :(

En lugar de (que en realidad le da la siguiente próxima Lunes):

 
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1) 
datetime.date(2009, 10, 26) 

diría:

 
>>> last_monday = today - datetime.timedelta(days=today.weekday()) 

Si desea la semana anterior, agregue el parámetro 'weeks = 1'.

Esto hace que el código sea más legible ya que está restando un timedelta. Esto borra cualquier confusión causada al agregar un timedelta que tiene un valor negativo y compensaciones positivas.

+1

+1 para su privs de comentarios futuros! – physicsmichael

+4

¡Whooohooo, puedo comentar ahora! Gracias. –

18

Creo que la forma más fácil es usar python-dateutil así:

from datetime import date 
from dateutil.relativedelta import relativedelta, MO 

today = date.today() 
last_monday = today + relativedelta(weekday=MO(-1)) 
print last_monday 
1

Usted puede utilizar Natty. Intenté parsedatetime y dateparser. Comparando estos tres, creo que Natty es la mejor.

para obtener su resultado, utilice la siguiente manera:

>>> from natty import DateParser 
>>> dp = DateParser('last monday') 
>>> dp.result() 
[datetime.datetime(2016, 8, 1, 17, 35, 5, tzinfo=tzlocal())] #Today is 9th of August 2016 5.35 PM 

Github Enlace: https://github.com/eadmundo/python-natty

Inténtelo, Se puede hacer más!

0

Para los futuros usuarios de Google que aparecen en esta página buscando la forma de obtener "el domingo más reciente", en lugar de "el lunes más reciente", necesita hacer algunas operaciones matemáticas adicionales porque datetime.weekday() trata el lunes como el primer día de la semana:

today = datetime.date.today() 
weekday = today.weekday() + 1 
start_day = today - datetime.timedelta(days=weekday % 7) 

Si hoy es martes, esto establece start_day al último domingo. Si hoy es domingo, establece start_day a hoy. Llévese el % 7 si quiere que "el último domingo" sea hace una semana si es actualmente el domingo.

Cuestiones relacionadas