При работе с датами часто возникает необходимость прибавлять к дате или вычитать из нее различные единицы времени, например, месяцы или годы.
Друзья, подписывайтесь на наш телеграм канал Pythonist. Там еще больше туториалов, задач и книг по 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 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».