Есть такая дата:
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
Я собираюсь получить конец месяца.






С красивым свиданием вы можете:
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)
Это решение не такое красивое.
Я использовал этот метод, чтобы быть коротким и не требовать дополнительных библиотек, я не уверен, делает ли это лучше или хуже, чем другой метод.
Конечно, но вы можете использовать DateOffset из pandas, который уже установлен.
Да, это правда, я отредактирую ответ, чтобы сделать его немного чище
в моем случае измените первый день следующих 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')
Это также может помочь: stackoverflow.com/a/74801480/13454049