@PesyCorm

Как прибавить несколько месяцев с помощью datetime?

Привет! Есть задачка, нет решения. Условие:
Написать функцию change_month, которая к переданной дате прибавляет/вычитает переданное кол-во месяцев.
Например:change_month(’12.12.12’, 7) -> ’12.07.13’ change_month(’01.11.10’, -5) -> ’01.06.10’
Разрешено использовать только внутренние библиотеки питона, желательно ограничиться datetime

Есть вариант такого исполнения:
>>> def change_month(mydate, months):
        skip_months = datetime.datetime(mydate.year + int(months / 12), (mydate.month % 12+ months % 12), 1)
        skip_months = skip_months + datetime.timedelta(days=mydate.day)
        print(skip_months)

>>> change_month(datetime.datetime(2021, 1, 1), 12)
2022-01-02 00:00:00

Но если (в случае данного решения), например, к дате 01.01.2021 добавить 12 месяцев ( == 1 год), то получим дату 02.01.2021 число, что не есть правда.
Как быть?
Спасибо за помощь!

p.s.: Еще раз уточню, что пользоваться можно только встроенными библиотеками
  • Вопрос задан
  • 767 просмотров
Решения вопроса 2
SoreMix
@SoreMix Куратор тега Python
yellow
Почему не правильно?

Формат даты представлен в виде ГОД-МЕСЯЦ-ДЕНЬ.
Изначально вы отправили дату 2021-01-01 00:00:00

Сделав так
skip_months = datetime.datetime(mydate.year + int(months / 12), (mydate.month % 12+ months % 12), 1)

вы получили 2022-01-01 00:00:00. То есть, 2022 год, 1 января. Потом к этому результату прибавили зачем-то еще один день (
skip_months = skip_months + datetime.timedelta(days=mydate.day)
)
И в результате получили 2022-01-02 00:00:00 - 2022 год, 2 января
Ответ написан
@dmshar
Ни непосредственно месяца, ни непосредственно года задать с помощью timedelta нельзя, и это понятно. Год может быть 365 и 366 дней, а месяц - 28,29,30 и 31.
Тем не менее обойти это можно. Ниже один варинат на чистом datatime, а остальные - с привлечением других библиотек.
Показываю на примере года. Думаю, с месяцем разберетесь сами по аналогии
import datetime as dt
from dateutil.relativedelta import relativedelta
import pandas as pd
d1=dt.datetime(2021, 5, 16)
print ('d1==',d1)
d2=d1.replace(year=d1.year+1)
print ('d2==',d2)
d3=d1+relativedelta(years=1)
print ('d3==',d3)
d4=d1+pd.DateOffset(years=1)
print ('d4==',d4)

Результаты:
d1== 2021-05-16 00:00:00
d2== 2022-05-16 00:00:00
d3== 2022-05-16 00:00:00
d4== 2022-05-16 00:00:00
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы