2009-10-25 13 views
40

Jak znaleźć datę z poprzedniego poniedziałku na podstawie daty bieżącej przy użyciu Pythona? Pomyślałem, że mógłbym użyć: datetime.weekday() żeby to zrobić, ale utknę.Znajdź poniedziałkową randkę z pythonem

Zasadniczo chcę znaleźć dzisiejszą datę i datę w poniedziałki, aby skonstruować zapytanie o zakres dat w django za pomocą: created__range=(start_date, end_date).

+0

Już w poniedziałek lub w miniony poniedziałek? –

+0

Szukałem ostatniego poniedziałku – Joe

Odpowiedz

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

Kilka słów wyjaśnienia:

Weź data dzisiejsza. Odejmij liczbę dni, które minęły w tym tygodniu (dzięki temu masz "ostatni" poniedziałek). Dodaj tydzień.

Edit: Powyższe jest na 'następny poniedziałek', ale ponieważ szukałeś 'ostatni poniedziałek' można użyć

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

Python jest niesamowity :) Jest to trudne i nietrywialne w większości innych języków. –

+0

Nie odpowiada na pytanie, które było na ostatni poniedziałek, a nie na poniedziałek –

+2

@GeraldKaszuba w rzeczywistości jest znacznie łatwiejsze i bardziej czytelne w PHP: 'new DateTime (" last poniedziałek ")' lub 'strtotime (" last poniedziałek ")'. – JustAC0der

0

Korzystanie timedeltas oraz moduł datetime:

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

podaje dzisiejszy dzień tygodnia, licząc od 0 (poniedziałek) do 6 (niedziela)

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

(7-d)% 7 daje dni aż do poniedziałku, albo pozostawia gdzie jesteś, jeśli dzisiaj jest poniedziałek

8

Uwaga: PO mówi w komentarzach, "Szukałem przeszłości poniedziałek ". Rozumiem, że szukamy w ostatni poniedziałek, który wydarzył się ściśle przed dzisiejszym dniem.

Obliczenie jest nieco trudne do uzyskania przy użyciu tylko modułu datetime (szczególnie biorąc pod uwagę powyższą interpretację "zeszłego poniedziałku" i jeśli chcesz uniknąć clunky if-statements). Na przykład, jeśli today jest poniedziałek, takich jak 2013-12-23,

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

powraca 2013-12-23, który jest taki sam dzień jak today (nie przeszłość poniedziałek).

Zaletą korzystania z dateutil module jest to, że nie trzeba wykonywać skomplikowanych obliczeń umysłowych ani zmuszać czytelnika do robienia tego samego, aby uzyskać prawidłową datę. dateutil robi to wszystko dla Ciebie:

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 

Zauważ, że days=-1 jest potrzebna, aby zagwarantować, że past_monday jest inny dzień niż today.

+0

Używasz łatwego narzędzia na swój sposób;) – diegueus9

32

Post ChristopheD jest bliski tego, co chcesz.Nie mam wystarczająco dużo rep, aby dodać komentarz :(

zamiast (który faktycznie daje kolejny zbliżający się poniedziałek):

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

bym słownie:

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

Jeśli chcesz z poprzedniego tygodnia, dodaj parametr "tygodnie = 1"

To sprawia, że ​​kod jest bardziej czytelny, ponieważ odejmujesz timedelta, co eliminuje wszelkie zamieszania spowodowane dodaniem timedelta, który ma negatywny i dodatnie przesunięcia.

+1

+1 dla twojego przyszłego komentarza privs! – physicsmichael

+4

Whooohooo, mogę teraz komentować! Dzięki. –

18

Myślę, że najprostszym sposobem jest użycie python-dateutil takiego:

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

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

Można użyć Natty. Próbowałem parseatetime i dateparser. Porównując te trzy, myślę, że najlepiej jest Natty.

Aby otrzymać wynik, należy tak:

>>> 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 Link: https://github.com/eadmundo/python-natty

Spróbuj, może zrobić więcej!

0

Dla przyszłych googlerów, którzy pojawią się na tej stronie szukając sposobu na "ostatnią niedzielę", a nie "ostatni poniedziałek", trzeba zrobić dodatkową matematykę, ponieważ datetime.weekday() traktuje w poniedziałek jako pierwszy dzień tygodnia:

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

Jeśli dziś jest wtorek, to ustawia start_day do ostatniej niedzieli. Jeśli dziś jest niedziela, ustawia się start_day na dzisiaj. Zabierz ze sobą % 7, jeśli chcesz "ostatnią niedzielę" być tydzień temu, jeśli jest w niedzielę.