Как прибавить дни, месяцы и годы к дате в Python

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

В этой статье мы разберем, как прибавлять к дате:

Прибавление дней к дате в Python

Для добавления к дате дней используйте класс timedelta() из модуля datetime. Этому классу можно передать аргумент days, и он добавит указанное количество дней к дате.

from datetime import datetime, date, timedelta

my_str = '09-24-2023'  # 👉️ (mm-dd-yyyy)
date_1 = datetime.strptime(my_str, '%m-%d-%Y')

print(date_1)  # 👉️ 2023-09-24 00:00:00

# ✅ Add 3 days to a date
result = date_1 + timedelta(days=3)
print(result)  # 👉️ 2023-09-27 00:00:00
Тот же код и его вывод в консоли

Убедитесь, что вы импортировали классы datetime или date и timedelta из модуля datetime.

Примечание: месяц (и год) при необходимости будут переноситься.

В примере используется метод datetime.strptime() для получения объекта datetime, соответствующего предоставленной строке даты, разобранной в соответствии с заданным форматом.

Получив объект datetime, мы можем использовать класс timedelta для добавления к нему дней.

from datetime import datetime, timedelta


my_str = '09-24-2023'  # 👉️ (mm-dd-yyyy)

date_1 = datetime.strptime(my_str, '%m-%d-%Y')
print(date_1)  # 👉️ 2023-09-24 00:00:00

result = date_1 + timedelta(days=3)
print(result)  # 👉️ 2023-09-27 00:00:00

Строка даты в примере отформатирована как mm-dd-yyyy.

Если у вас строка даты отформатирована иначе, воспользуйтесь таблицей в документации, чтобы найти код формата, который нужно передать в качестве второго аргумента методу strptime().

Добавление дней к текущей дате

Если вам нужно добавить дни к текущей дате, используйте метод datetime.today(). Он возвращает текущий локальный datetime.

from datetime import datetime, timedelta


current_date = datetime.today()
print(current_date)  # 👉️ 2023-07-22 10:43:15.536277


# ✅ Add 7 days to the current date
result = current_date + timedelta(days=7)
print(result)  # 👉️ 2023-07-29 10:43:15.536277
Тот же код и его вывод в консоли

Использование класса date для добавления дней к дате

При добавлении дней к дате вместо класса datetime можно использовать класс date.

from datetime import date, timedelta

date_1 = date(2023, 9, 24)
print(date_1)  # 👉️ 2023-09-24

reuslt = date_1 + timedelta(days=3)
print(reuslt)  # 👉️ 2023-09-27
Тот же код и его вывод в консоли

Классу datetime.timedelta можно передать дни, которые мы хотим добавить к объектам date или datetime. В качестве аргументов классу timedelta можно передавать дни, недели, часы, минуты, секунды, миллисекунды и микросекунды (days, weeks, hours, minutes, seconds, milliseconds, microseconds).

Все аргументы необязательны и по умолчанию равны 0.

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

Использование метода date() для получения даты после добавления дней

Если после добавления дней к дате вам нужно получить только полученную дату, вызовите метод date() на объекте datetime. Метод datetime.date возвращает объект date с теми же годом, месяцем и днем.

from datetime import datetime, timedelta

now = datetime.now()
print(now)  # 👉️ 2023-02-18 18:41:00.827570

result = now + timedelta(days=5)
print(result)  # 👉️ 2023-02-23 18:41:00.827570

print(result.date())  # 👉️ 2023-02-23

Если вам нужно отформатировать дату определенным образом, используйте f-строки. Они позволяют включать выражения внутрь строки. Обязательно окружайте выражения фигурными скобками — {expression}.

from datetime import datetime, timedelta

now = datetime.now()
print(now)  # 👉️ 2023-02-18 18:41:30.558332

result = now + timedelta(days=6)
print(result)  # 👉️ 2023-02-24 18:41:30.558332

print(result.date())  # 👉️ 2023-02-24

print(f'{result:%Y-%m-%d %H:%M:%S}')  # 👉️ 2023-02-24 18:41:30

Добавление дней к объекту date, хранящему текущую дату

Приведем пример добавления дней к объекту date, который представляет текущую дату.

from datetime import date, timedelta


date_1 = date.today()
print(date_1)  # 👉️ 2023-07-22

result = date_1 + timedelta(days=7)
print(result)  # 👉️ 2023-07-29
Тот же код и его вывод в консоли

Метод date.today возвращает объект date, представляющий текущую локальную дату.

Прибавление недель к дате в Python

Чтобы добавить к дате недели, используйте класс timedelta из модуля datetime. Ему можно передать аргумент weeks, и он добавит указанное количество недель к дате.

Обязательно импортируйте классы datetime или date и timedelta из модуля datetime.

from datetime import datetime, date, timedelta

my_str = '09-14-2023'  # 👉️ (mm-dd-yyyy)
date_1 = datetime.strptime(my_str, '%m-%d-%Y')

print(date_1)  # 👉️ 2023-09-14 00:00:00

# ✅ add 2 weeks to a date
result = date_1 + timedelta(weeks=2)
print(result)  # 👉️ 2023-09-28 00:00:00

Мы передали классу timedelta именованный аргумент weeks, но вы также можете передать ему аргумент days, например timedelta(days=14). В любом случае месяц (и год) будут перенесены, если это необходимо.

В примере используется метод datetime.strptime() для получения объекта datetime, соответствующего предоставленной строке даты, разобранной в соответствии с заданным форматом.

Получив объект datetime, мы можем использовать класс timedelta, чтобы добавить к нему недели.

from datetime import datetime, date, timedelta

my_str = '09-14-2023'  # 👉️ (mm-dd-yyyy)
date_1 = datetime.strptime(my_str, '%m-%d-%Y')

print(date_1)  # 👉️ 2023-09-14 00:00:00

result = date_1 + timedelta(weeks=2)
print(result)  # 👉️ 2023-09-28 00:00:00

Строка даты в примере отформатирована как mm-dd-yyy. Если у вас строка даты отформатирована по-другому, воспользуйтесь таблицей в документации, чтобы найти коды формата, которые нужно передать в качестве второго аргумента методу strptime().

Добавление недель к текущей дате

Если вам нужно добавить недели к текущей дате, используйте метод datetime.today(). Он возвращает текущее локальное время.

from datetime import datetime, timedelta

current_date = datetime.today()
print(current_date)  # 👉️ 2023-02-18 18:46:07.541963

result = current_date + timedelta(weeks=1)
print(result)  # 👉️ 2023-02-25 18:46:07.541963

Использование класса date() для добавления недель к дате

Прибавляя недели к дате, вместо класса datetime можно использовать класс date().

from datetime import date, timedelta

date_1 = date(2023, 9, 7)
print(date_1)  # 👉️ 2023-09-07

result = date_1 + timedelta(weeks=3)
print(result)  # 👉️ 2023-09-28

Классу datetime.timedelta можно передавать недели, которые мы хотим добавить к объектам date или datetime.

Добавление недель к объекту date, хранящему текущую дату

Следующий пример добавляет недели к объекту date, который представляет текущую дату.

from datetime import date, timedelta

date_1 = date.today()
print(date_1)  # 👉️ 2023-02-18

result = date_1 + timedelta(weeks=2)
print(result)  # 👉️ 2023-03-04

Метод date.today возвращает объект date, представляющий текущую локальную дату.

Прибавление месяцев к дате в Python

Чтобы прибавить месяцы к дате в коде на Python, используйте класс relativedelta из модуля dateutil.relativedelta. Этот класс автоматически обрабатывает месяцы с разным количеством дней.

Убедитесь, что вы импортировали класс relativedelta и классы date или datetime.

from datetime import date, datetime
from dateutil.relativedelta import relativedelta


date_1 = date(2023, 6, 24)
print(date_1)  # 👉️ 2023-06-24

# ✅ add 3 months to a date
result = date_1 + relativedelta(months=+3)
print(result)  # 👉️ 2023-09-24
Тот же код и его вывод в консоли

Установка python-dateutil

Если у вас не установлен модуль python-dateutil, выполните следующую команду:

pip install python-dateutil

# 👇️ or with pip3
pip3 install python-dateutil
Установка python-dateutil в консоли

Модуль python-dateutil предоставляет расширения для стандартного модуля Python datetime.

В примере показано, как прибавить месяцы в объект date.

from datetime import date, datetime
from dateutil.relativedelta import relativedelta


date_1 = date(2023, 6, 24)
print(date_1)  # 👉️ 2023-06-24

result = date_1 + relativedelta(months=+3)
print(result)  # 👉️ 2023-09-24

Обратите внимание, что перед числом месяцев мы поставили знак плюс +, чтобы указать, что мы хотим добавить указанное число месяцев.

При необходимости год будет перенесен автоматически (например, при добавлении 5 месяцев к дате в ноябре).

Как прибавить месяцы к текущей дате

Если вам нужно добавить месяцы к текущей дате, используйте метод date.today(). Он возвращает объект date, представляющий текущую локальную дату.

from datetime import date, datetime
from dateutil.relativedelta import relativedelta


date_1 = date.today()
print(date_1)  # 👉️ 2023-07-21

result = date_1 + relativedelta(months=+2)
print(result)  # 👉️ 2023-09-21
Тот же код и его вывод в консоли

Не забудьте импортировать классы relativedelta и date.

Извлечение даты после добавления месяцев

Если после прибавления месяцев вам нужно извлечь только дату (без времени), вызовите метод date() для объекта datetime.

from datetime import datetime
from dateutil.relativedelta import relativedelta

now = datetime.now()
print(now)  # 👉️ 2023-07-21 08:39:13.428040

result = now + relativedelta(months=+3)

print(result)  # 👉️ 2023-10-21 08:39:13.428040

# 👇️ only extract updated date
print(result.date())  # 👉️ 2023-10-21
Тот же код и его вывод в консоли

Метод datetime.date возвращает объект date с теми же годом, месяцем и днем.

Форматирование даты

Если вам нужно отформатировать дату определенным образом, используйте f-строки. Они позволяют включать в строку выражения.

from datetime import datetime
from dateutil.relativedelta import relativedelta

now = datetime.now()
print(now)  # 👉️ 2023-02-18 18:54:05.944818

result = now + relativedelta(months=+5)

print(result)  # 👉️ 2023-07-18 18:54:05.944818

# 👇️ only extract updated date
print(result.date())  # 👉️ 2023-07-18

print(f'{result:%Y-%m-%d %H:%M:%S}')  # 👉️ 2023-07-18 18:54:05

Убедитесь, что окружили выражения фигурными скобками: {expression}.

Добавление месяцев к объекту datetime, полученному из строки даты

Вы также можете создать объект datetime из строки даты и добавить месяцы к нему.

from datetime import datetime
from dateutil.relativedelta import relativedelta


my_str = '09-24-2023'  # 👉️ (mm-dd-yyyy)

date_1 = datetime.strptime(my_str, '%m-%d-%Y')
print(date_1)  # 👉️ 2023-09-24 00:00:00


result = date_1 + relativedelta(months=+2)
print(result)  # 👉️ 2023-11-24 00:00:00
Тот же код и его вывод в консоли

Метод datetime.strptime() возвращает объект datetime, соответствующий предоставленной строке даты, разобранной в соответствии с форматом.

Если ваша строка даты отформатирована по-другому, воспользуйтесь таблицей в документации, чтобы найти код формата, который нужно передать в качестве второго аргумента методу strptime().

Добавление месяцев к текущей дате с помощью объекта datetime

Следующий пример добавляет месяцы к текущей дате с помощью объекта datetime.

from datetime import datetime
from dateutil.relativedelta import relativedelta


date_1 = datetime.today()
print(date_1)  # 👉️ 2023-07-21 08:44:16.815774

result = date_1 + relativedelta(months=+3)
print(result)  # 👉️ 2023-10-21 08:44:16.815774
Тот же код и его вывод в консоли

Метод datetime.today() возвращает текущую локальную дату и время.

Прибавление лет к дате в Python

Чтобы добавить к дате годы, используйте метод datetime.replace(). Метод replace вернет новую дату с теми же атрибутами, за исключением года, который будет обновлен в соответствии с указанным значением.

from datetime import datetime, date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        # 👇️ preserve calendar day (if Feb 29th doesn't exist, set to 28th)
        return start_date.replace(year=start_date.year + years, day=28)


# ✅ add years to a date
my_str = '09-14-2023'  # 👉️ (mm-dd-yyyy)
date_1 = datetime.strptime(my_str, '%m-%d-%Y')
print(date_1)  # 👉️ 2023-09-14 00:00:00

result_1 = add_years(date_1, 3)
print(result_1)  # 👉️ 2026-09-14 00:00:00

# -----------------------------------------------

# ✅ add years to the current date

current_date = datetime.today()
print(current_date)  # 👉️ 2023-02-18 18:57:28.484966

result_2 = add_years(current_date, 2)
print(result_2)  # 👉️ 2025-02-18 18:57:28.484966
Тот же код и его вывод в консоли

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

Метод datetime.replace возвращает объект с теми же атрибутами, за исключением атрибутов, которые были предоставлены в качестве именованных аргументов.

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

В первом примере используется метод datetime.strptime() для получения объекта datetime, соответствующего предоставленной строке даты, разобранной в соответствии с заданным форматом.

Получив объект datetime, мы можем использовать метод replace() для замены года.

from datetime import datetime, date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        # 👇️ preserve calendar day (if Feb 29th doesn't exist, set to 28th)
        return start_date.replace(year=start_date.year + years, day=28)


# ✅ add years to a date
my_str = '09-14-2023'  # 👉️ (mm-dd-yyyy)
date_1 = datetime.strptime(my_str, '%m-%d-%Y')
print(date_1)  # 👉️ 2023-09-14 00:00:00

result_1 = add_years(date_1, 3)
print(result_1)  # 👉️ 2026-09-14 00:00:00

Строка даты в примере отформатирована как mm-dd-yyyy. Если у вас строка даты отформатирована иначе, воспользуйтесь таблицей в документации, чтобы найти код формата, который нужно передать во второй аргумент метода strptime().

Поскольку мы сохраняем месяц и день месяца, мы должны учитывать, что в феврале 29 дней в високосном году и 28 дней в невисокосном.

Текущая дата может быть 29 февраля

Текущая дата может быть 29 февраля, а добавление X лет может возвращать невисокосный год, в котором 29 февраля не является валидной датой.

В этом случае мы обновляем год и устанавливаем день месяца на 28-е число.

def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        # 👇️ preserve calendar day (if Feb 29th doesn't exist, set to 28th)
        return start_date.replace(year=start_date.year + years, day=28)

Альтернативный подход заключается в том, чтобы установить дату на 1 марта, если в этом году нет 29 февраля.

from datetime import datetime, date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        # 👇️ preserve calendar day (if Feb 29th doesn't exist
        # set to March 1st)
        return start_date + (
            date(start_date.year + years, 1, 1) - date(start_date.year, 1, 1)
        )


# ✅ add years to a date
my_str = '02-29-2024'  # 👉️ (mm-dd-yyyy)
date_1 = datetime.strptime(my_str, '%m-%d-%Y')
print(date_1)  # 👉️ 2024-02-29 00:00:00

result_1 = add_years(date_1, 3)
print(result_1)  # 👉️ 2027-03-01 00:00:00
Тот же код и его вывод в консоли

Добавление лет к текущей дате

Второй пример добавляет годы к текущей дате. Метод datetime.today() возвращает текущее локальное время.

from datetime import datetime, date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        return start_date.replace(year=start_date.year + years, day=28)


current_date = datetime.today()
print(current_date)  # 👉️ 2023-07-22 20:24:47.538361

result_2 = add_years(current_date, 2)
print(result_2)  # 👉️ 2025-07-22 20:24:47.538361

Извлечение только компонентов даты

Если после добавления к дате лет вам нужно извлечь только дату, вызовите метод date() на объекте datetime.

from datetime import datetime, date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        # 👇️ preserve calendar day (if Feb 29th doesn't exist
        # set to March 1st)
        return start_date + (
            date(start_date.year + years, 1, 1) - date(start_date.year, 1, 1)
        )


now = datetime.now()
print(now)  # 👉️ 2023-02-18 18:59:48.402212


result = add_years(now, 1)
print(result)  # 👉️ 2024-02-18 18:59:48.402212

# 👇️ only get a date object
print(result.date())  # 👉️ 2024-02-18

Форматирование даты

Если вам нужно отформатировать дату определенным образом, используйте f-строки. Они позволяют включать выражения внутрь строки. Не забывайте заключать выражения в фигурные скобки — {expression}.

from datetime import datetime, date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        return start_date + (
            date(start_date.year + years, 1, 1) - date(start_date.year, 1, 1)
        )


now = datetime.now()
print(now)  # 👉️ 2023-02-18 19:00:11.870596


result = add_years(now, 1)
print(result)  # 👉️ 2024-02-18 19:00:11.870596


# 👇️ format the date
print(f'{result:%Y-%m-%d %H:%M:%S}')  # 👉️ 2024-02-18 19:00:11

Прибавление лет к дате с помощью класса date()

Для добавления лет к дате можно использовать класс date() вместо класса datetime.

from datetime import date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        return start_date.replace(year=start_date.year + years, day=28)


date_3 = date(2023, 9, 7)
print(date_3)  # 👉️ 2023-09-07

result_3 = add_years(date_3, 5)
print(result_3)  # 👉️ 2028-09-07

Вот пример, который добавляет годы к объекту date, представляющему текущую дату.

from datetime import datetime, date


def add_years(start_date, years):
    try:
        return start_date.replace(year=start_date.year + years)
    except ValueError:
        return start_date.replace(year=start_date.year + years, day=28)


# ✅ add years to current date (using date instead of datetime)
date_4 = date.today()
print(date_4)  # 👉️ 2022-06-20

result_4 = add_years(date_4, 6)
print(result_4)  # 👉️ 2028-06-20

Метод date.today возвращает объект date, представляющий текущую локальную дату.

Перевод статей «How to add Days or Weeks to a Date in Python», «How to add Months to a Date in Python», «How to add year(s) to a date in Python».