Найти дату понедельника с Python

python django

34412 просмотра

8 ответа

2193 Репутация автора

Как мне найти дату предыдущего понедельника, основанную на текущей дате, используя Python? Я думал, может быть, я мог бы использовать: datetime.weekday()сделать это, но я застреваю.

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

Автор: Joe Источник Размещён: 25.10.2009 08:53

Ответы (8)


144 плюса

86848 Репутация автора

Решение
>>> 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())
Автор: ChristopheD Размещён: 25.10.2009 09:02

1 плюс

1296 Репутация автора

Использование timedeltas и модуля datetime:

import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())
Автор: elzapp Размещён: 25.10.2009 09:06

0 плюса

3502 Репутация автора

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

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

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

(7-d)% 7 дает вам дни до понедельника или оставляет вас там, где вы есть, если сегодня понедельник

Автор: foosion Размещён: 25.10.2009 09:07

8 плюса

603324 Репутация автора

Примечание: ОП говорит в комментариях: « Я искал прошедший понедельник ». Я полагаю, это означает, что мы ищем последний понедельник, который произошел строго до сегодняшнего дня.

Вычисление немного сложно сделать правильно, используя только 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.

Автор: unutbu Размещён: 25.10.2009 09:28

39 плюса

725 Репутация автора

Пост ChristopheD близок к тому, что вы хотите. У меня недостаточно репутации, чтобы комментировать :(

Вместо (что фактически дает вам следующий предстоящий понедельник):

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

Я бы сказал:

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

Если вы хотите предыдущую неделю, добавьте параметр 'days = 1'.

Это делает код более читабельным, поскольку вы вычитаете временную дельту. Это устраняет любую путаницу, вызванную добавлением временной дельты с отрицательными и положительными смещениями.

Автор: Steven Graham Размещён: 25.10.2009 10:12

20 плюса

11665 Репутация автора

Я думаю, что самый простой способ - использовать 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
Автор: diegueus9 Размещён: 16.02.2012 07:13

1 плюс

925 Репутация автора

Вы можете использовать Нетти . Я попробовал parsedatetime и dateparser . Сравнивая эти три, я думаю, что 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

Попробуйте, это может сделать больше!

Автор: AnsarAdimu Размещён: 09.08.2016 12:08

1 плюс

3172 Репутация автора

Для будущих гуглеров, которые появляются на этой странице в поисках способа получить «самое последнее воскресенье», а не «самый последний понедельник», вам нужно сделать дополнительную математику, потому что datetime.weekday () рассматривает понедельник как первый день недели:

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

Если сегодня вторник, то это start_dayв прошлое воскресенье. Если сегодня воскресенье, это наборы start_dayна сегодняшний день . Уберите, % 7если хотите, чтобы «последнее воскресенье» было неделю назад, если сейчас воскресенье.

Автор: coredumperror Размещён: 07.12.2017 10:13
Вопросы из категории :
32x32