Есть ли способ использовать стандартную библиотеку Python для простого определения (то есть одного вызова функции) последнего дня данного месяца?
Если стандартная библиотека не поддерживает это, поддерживает ли пакет dateutil это?
Я не заметил этого раньше, когда просматривал документацию по calendar
модулю , но вызываемый метод monthrange
предоставляет эту информацию:
monthrange (year, month)
Возвращает будний день первого дня месяца и количество дней в месяце для указанного года и месяца.
>>> import calendar
>>> calendar.monthrange(2002,1)
(1, 31)
>>> calendar.monthrange(2008,2)
(4, 29)
>>> calendar.monthrange(2100,2)
(0, 28)
так:
calendar.monthrange(year, month)[1]
кажется, самый простой способ пойти.
Просто чтобы прояснить, monthrange
поддерживает и високосные годы:
>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)
Мой предыдущий ответ все еще работает, но явно неоптимальный.
28
как ответ, который является правильным, используя правила для григорианского календаряmonthrange
что это запутанное имя. Вы могли бы подумать, что он вернется(first_day, last_day)
, а не(week_day_of_first_day, number_of_days)
Если вы не хотите импортировать
calendar
модуль, простая двухэтапная функция также может быть:Выходы:
источник
РЕДАКТИРОВАТЬ: См. Ответ @Blair Conrad для более чистого решения
источник
today.month + 1 == 13
вы получаетеValueError
.(today.month % 12) + 1
так как12 % 12
дает 0На самом деле это довольно просто
dateutil.relativedelta
(пакет python-datetutil для pip).day=31
всегда будет всегда возвращать последний день месяца.Пример:
источник
datetime(2014, 2, 1) + relativedelta(days=31)
даетdatetime(2014, 3, 4, 0, 0)
...months
добавляется, а затемseconds
вычитается. Поскольку они передаются так, как**kwargs
я бы на них не полагался, и делали ряд отдельных операций:now + relative(months=+1) + relative(day=1) + relative(days=-1)
это однозначно.last_day = (<datetime_object> + relativedelta(day=31)).day
РЕДАКТИРОВАТЬ: см. Мой другой ответ . Он имеет лучшую реализацию, чем эта, которую я оставлю здесь на всякий случай, если кому-то интересно посмотреть, как можно «свернуть свой собственный» калькулятор.
@ Джон Милликин дает хороший ответ, с дополнительным усложнением вычисления первого дня следующего месяца.
Следующее не особенно элегантно, но чтобы выяснить последний день месяца, в котором живет любая конкретная дата, вы можете попробовать:
источник
today = datetime.date.today(); start_date = today.replace(day=1)
, Вам следует избегать повторного вызова datetime.now, если вы звоните ему до полуночи 31 декабря, а затем сразу после полуночи. Вы получите 2016-01-01 вместо 2016-12-01 или 2017-01-01.date
является экземпляромdatetime.date
,datetime.datetime
а такжеpandas.Timestamp
.Используя
dateutil.relativedelta
вы получите последнюю дату месяца, как это:Идея состоит в том, чтобы получить первый день месяца и использовать его
relativedelta
для перехода на 1 месяц вперед и 1 день назад, чтобы получить последний день месяца, который вы хотели.источник
Другое решение было бы сделать что-то вроде этого:
И используйте функцию следующим образом:
источник
источник
источник
если вы хотите использовать внешнюю библиотеку, проверьте http://crsmithdev.com/arrow/
Вы можете получить последний день месяца с помощью:
Это возвращает объект даты, который вы можете затем сделать ваши манипуляции.
источник
Чтобы получить последнюю дату месяца, мы делаем что-то вроде этого:
Теперь, чтобы объяснить, что мы делаем здесь, мы разделим его на две части:
во-первых, получаем количество дней в текущем месяце, для которых мы используем месяц, который Блэр Конрад уже упомянул о своем решении:
во-вторых, получение самой последней даты, которую мы делаем с помощью замены, например
и когда мы объединяем их, как указано выше, мы получаем динамическое решение.
источник
date.replace(day=day)
чтобы все знали, что происходит.В Python 3.7 есть недокументированная
calendar.monthlen(year, month)
функция :Это эквивалентно документированному
calendar.monthrange(year, month)[1]
звонку .источник
источник
Используйте панд!
источник
pd.series.dt.is_month_end
ссылкиnow=datetime.datetime.now(); pd_now = pd.to_datetime(now); print(pd_now.days_in_month)
Для меня это самый простой способ:
источник
Самый простой способ (без необходимости импортировать календарь) - получить первый день следующего месяца, а затем вычесть из него день.
Вывод:
PS: этот код работает быстрее по сравнению с
import calendar
подходом; см. ниже:ВЫВОД:
Этот код предполагает, что вы хотите указать дату последнего дня месяца (т. Е. Не только часть DD, но и всю дату ГГГГММДД)
источник
import calendar
?Вот еще один ответ. Никаких дополнительных пакетов не требуется.
Получите первый день следующего месяца и вычтите из него один день.
источник
Вы можете рассчитать дату окончания самостоятельно. простая логика - вычесть день из даты начала следующего месяца. :)
Так что напишите собственный метод,
Вызов,
Он вернет дату окончания этого месяца. Передайте любую дату этой функции. возвращает вам дату окончания этого месяца.
источник
Вы можете использовать родственник Аддета https://dateutil.readthedocs.io/en/stable/relativedelta.html
month_end = <your datetime value within the month> + relativedelta(day=31)
, который даст вам последний день.источник
Это самое простое решение для меня, использующее только стандартную библиотеку datetime:
источник
Это не решает основной вопрос, но есть один хороший трюк, чтобы получить последний день недели в месяце - использовать
calendar.monthcalendar
матрицу дат, организованную с понедельника в качестве первого столбца до воскресенья в качестве последнего.Все
[0:-2]
дело в том, чтобы сбрить колонки выходных и выбросить их. Даты, которые выходят за пределы месяца, обозначены 0, поэтому максимум фактически игнорирует их.Использование
numpy.ravel
не является строго необходимым, но я ненавижу полагаться на простое соглашение ,numpy.ndarray.max
которое сгладит массив, если не будет указано, по какой оси вычислять.источник
Вывод:
Будет напечатан последний день текущего месяца. В этом примере это было 15 мая 2016 года. Таким образом, ваш вывод может быть другим, однако выходной будет столько же дней, сколько текущий месяц. Отлично, если вы хотите проверить последний день месяца, запустив ежедневную работу cron.
Так:
Вывод:
Если это не последний день месяца.
источник
Я предпочитаю этот путь
источник
Если вы хотите сделать свою собственную маленькую функцию, это хорошая отправная точка:
Для этого вы должны знать правила для високосных лет:
источник
Если вы передаете диапазон дат, вы можете использовать это:
источник
В приведенном ниже коде «get_last_day_of_month (dt)» даст вам это с датой в строковом формате, например «YYYY-MM-DD».
источник
Простейшим способом является использование
datetime
некоторой математической даты, например, вычитание дня из первого дня следующего месяца:В качестве альтернативы вы можете использовать,
calendar.monthrange()
чтобы получить количество дней в месяце (с учетом високосных годов) и соответственно обновить дату:Быстрый тест показывает, что первая версия заметно быстрее:
источник
Вот длинная (простая для понимания) версия, но она заботится о високосных годах.
ура, JK
источник
else: pass
а также вы можете избавитьсяif year % 400 == 0: leap_year_flag = 1
с небольшими изменениямиВот решение на основе Python Lambdas:
next_month
Лямбда находит кортеж представление в первый день следующего месяца, а роллы на следующий год.month_end
Лямбда преобразует дату (dte
) к кортежу, применяетсяnext_month
и создает новую дату. Тогда «конец месяца» - это минус первый день следующего месяцаtimedelta(days=1)
.источник