Получить конец следующего месяца

Есть такая дата:

Timestamp('2020-10-17 00:00:00')

Как я могу получить конец следующего месяца?

Вывод должен быть таким:

Timestamp('2020-11-30 00:00:00')

Я пробовал rrule, но это не работает правильно.

Мой код:

import pandas as pd
from datetime import date
from dateutil.rrule import rrule, MONTHLY

start_date = date(2020, 9, 17)
end_date = date(2020, 10, 31)

for d in rrule(MONTHLY, dtstart=start_date, until=end_date):
    t = pd.Timestamp(d)
    print(t)

Выход:

2020-09-17 00:00:00
2020-10-17 00:00:00

Я собираюсь получить конец месяца.

Это также может помочь: stackoverflow.com/a/74801480/13454049

Nineteendo 28.12.2022 11:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
83
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

С красивым свиданием вы можете:

from beautiful_date import D, months, day, days

last_day_of_the_month = D.today() + 1 * months + 1 * day - 1 * days

Это берет текущий день (D.today()), переходит к следующему месяцу (+ 1 * months), переходит к первому дню следующего месяца (+ 1 * day) и возвращается на один день назад, то есть к последнему дню текущего месяца (- 1 * days).

И вы можете легко преобразовать его в дату и время:

last_day_of_the_month[0:0]

Вы можете сделать это следующим образом:

import pandas as pd
from datetime import datetime, date

date = date(2020, 10, 17)
last_day_of_next_month = pd.Timestamp(datetime.datetime(date.year, ((date.month+2) % 12), 1) - datetime.timedelta(days=1))

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

Обновлено:

Это можно сделать более аккуратно, используя панды DateOffset, как указано в комментариях и в другом ответе:

import pandas as pd
from datetime import date

date = date(2020, 10, 17)
last_day_of_next_month = pd.Timestamp(date) + pd.offsets.DateOffset(months=1) + pd.offsets.MonthEnd(0)

Это решение не такое красивое.

Nineteendo 28.12.2022 11:54

Я использовал этот метод, чтобы быть коротким и не требовать дополнительных библиотек, я не уверен, делает ли это лучше или хуже, чем другой метод.

Nasser Kessas 28.12.2022 12:15

Конечно, но вы можете использовать DateOffset из pandas, который уже установлен.

Nineteendo 28.12.2022 12:25

Да, это правда, я отредактирую ответ, чтобы сделать его немного чище

Nasser Kessas 28.12.2022 12:31
Ответ принят как подходящий

в моем случае измените первый день следующих 2 месяцев. а потом минус 1 день.

я также использую это в java.

образец кода

import pandas as pd
t = pd.Timestamp('2020-10-17 00:00:00')
t = t.replace(day=1)
answer = t + pd.DateOffset(months=2) + pd.DateOffset(days=-1)

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

import pandas as pd
from datetime import date
import calendar


def get_nextmonth(d):
    nextmonth_lastday = calendar.monthrange(d.year, d.month+1)[1]  # this return first and last day of the given month, such as (0, 30)
    return date(d.year, d.month+1, nextmonth_lastday)


start_date = date(2020, 9, 17)

print(get_nextmonth(start_date))
# 2020-10-31

Dateutil также работает: Я устанавливаю дни на 1, иду на два месяца дальше и возвращаюсь на один день назад.

#pip install python-dateutil
from datetime import date
from dateutil.relativedelta import relativedelta
DAY = relativedelta(days=+1)
MONTH = relativedelta(months=+1)
first_date = date(2020, 10, 17).replace(day=1)
print(first_date + 2 * MONTH - DAY)

Выход:

2020-11-30

Я бы сделал так:

from datetime import date,timedelta
start_date = date(2020, 9, 17)
last_day_month=date(start_date.year,start_date.month+1,1)-timedelta(days=1)

Используйте векторный способ pandas, который быстр для больших объемов данных.

import pandas as pd

ts = pd.Timestamp(2022, 1, 15)
ts + pd.offsets.DateOffset(months=1) + pd.offsets.MonthEnd(0) --> 

Out: Timestamp('2022-02-28 00:00:00')

ts = pd.Timestamp(2022, 1, 31)
ts + pd.offsets.DateOffset(months=1) + pd.offsets.MonthEnd(0) --> putting 0 to get same month last date though it was last date 

Out: Timestamp('2022-02-28 00:00:00')

ts = pd.Timestamp(2022, 1, 31)
ts + pd.offsets.DateOffset(months=1) + pd.offsets.MonthEnd()

Out: Timestamp('2022-03-31 00:00:00')

Другие вопросы по теме