Знайдіть дату понеділка за допомогою Python


78

Як знайти дату попереднього понеділка, виходячи з поточної дати, використовуючи Python? Я подумав, можливо, я міг би використати:datetime.weekday() зробити це, але я застряг.

Я в принципі хочу знайти сьогоднішню дату і дату понеділків побудувати запит діапазону дат в Джанго з допомогою: created__range=(start_date, end_date).


Прийде понеділок чи минулий понеділок?
Мартін проти Левіса,

Я шукав минулий понеділок
Джо

Відповіді:


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

Кілька слів пояснення:

Візьміть сьогоднішню дату. Відніміть кількість днів, які вже минули цього тижня (це дає вам "останній" понеділок). Додайте один тиждень.

Редагувати : Вище наведено для "наступного понеділка", але оскільки ви шукали "минулий понеділок", ви можете використати

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

12
Python чудовий :) Це складно і нетривіально в більшості інших мов.
gak

1
Насправді не відповідає на питання, яке було минулого понеділка, а не наступного понеділка
Мартін Спамер

2
@GeraldKaszuba насправді це набагато простіше і читабельніше в PHP: new DateTime("last monday")або strtotime("last monday").
JustAC0der

@ JustAC0der Як би ви отримали останній понеділок до довільної дати, на відміну від сьогоднішнього?
BallpointBen

1
@BallpointBen Наприклад:, strtotime("last monday", strtotime("2018-03-14"))але я не хочу вступати в дискусію про те, яка мова краща. Усі мови мають свої недоліки та переваги.
JustAC0der 21.03.18

44

Пост ChristopheD близький до того, що ви хочете. У мене недостатньо представників, щоб зробити коментар :(

Замість (що насправді дає вам наступний наступний понеділок):

>>> сьогодні + datetime.timedelta (days = -today.weekday (), weeks = 1)
datetime.date (2009, 10, 26)

Я б сказав:

>>> last_monday = сьогодні - datetime.timedelta (days = сьогодні.тиждень ())

Якщо потрібно попередній тиждень, додайте параметр 'weeks = 1'.

Це робить код більш читабельним, оскільки ви віднімаєте таймельта. Це усуває будь-яку плутанину, спричинену додаванням таймельти, яка має негативні та позитивні компенсації.


6
Уууууууу, я можу прокоментувати зараз! Дякую.
Стівен Грем

Вищевказане рішення для пошуку минулого понеділка може працювати не у всіх випадках. Приклад нижче: >>> from datetime import date, timedelta >>> today = date(2020, 4, 6) >>> today - timedelta(days=today.weekday()) datetime.date(2020, 4, 6) >>>
sreenath sirimala

21

Я думаю, що найпростіший спосіб - використовувати python-dateutil так:

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

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

11

Примітка. У коментарях ОП сказано: " Я шукав минулий понеділок ". Я сприймаю це як означає, що ми шукаємо останнього понеділка, який відбувся строго до сьогодні.

Правильно розрахувати, використовуючи лише datetimeмодуль, трохи складно (особливо, враховуючи наведене вище тлумачення "минулого понеділка", і якщо ви хочете уникнути незграбності if-statements). Наприклад, якщо todayце понеділок, такий як 2013-12-23,

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

повертається 2013-12-23, це той самий день, що й today(не минулий понеділок).

Перевага використання модуля dateutil полягає в тому, що вам не потрібно робити хитрих розумових обчислень і не змушувати читача робити те саме, щоб отримати правильну дату. dateutilробить все це за вас:

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

Зверніть увагу, що days=-1це потрібно, щоб гарантувати, що past_mondayдень відрізняється від дня today.


Ви використовуєте простий інструмент на жорсткому шляху;)
diegueus9

2

Ви можете використовувати Natty . Я спробував аналізувати час аналізу і датапарсер . Порівнюючи ці три, я думаю, що Натті найкраща.

Щоб отримати ваш результат, використовуйте так:

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

Спробуйте, це може зробити більше!


2

Для майбутніх гуглерів, які з’являються на цій сторінці і шукають спосіб отримати „останню неділю”, а не „найсвіжіший понеділок”, вам потрібно пройти додаткову математику, оскільки datetime.weekday () трактує понеділок як перший день тижня:

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

Якщо сьогодні вівторок, це означає start_dayостанню неділю. Якщо сьогодні неділя, це набори start_dayна сьогоднішній день . Приберіть, % 7якщо ви хочете, щоб "минула неділя" була тиждень тому, якщо зараз неділя.


1

Використання модулів timedeltas та datetime:

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

0
d = datetime.datetime.today().weekday()

дає вам сьогоднішній день тижня, рахуючи від 0 (понеділок) до 6 (неділя)

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

(7-d)% 7 дає вам дні до понеділка або залишає вас там, де ви є, якщо сьогодні понеділок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.