Python datetime как прибавить дни
Для форматирования объектов date и time в обоих этих классах предусмотрен метод strftime(format) . Этот метод принимает только один параметр, указывающий на формат, в который нужно преобразовать дату или время.
Для определения формата мы можем использовать один из следующих кодов форматирования:
- %a : аббревиатура дня недели. Например, Wed — от слова Wednesday (по умолчанию используются английские наименования)
- %A : день недели полностью, например, Wednesday
- %b : аббревиатура названия месяца. Например, Oct (сокращение от October)
- %B : название месяца полностью, например, October
- %d : день месяца, дополненный нулем, например, 01
- %m : номер месяца, дополненный нулем, например, 05
- %y : год в виде 2-х чисел
- %Y : год в виде 4-х чисел
- %H : час в 24-х часовом формате, например, 13
- %I : час в 12-ти часовом формате, например, 01
- %M : минута
- %S : секунда
- %f : микросекунда
- %p : указатель AM/PM
- %c : дата и время, отформатированные под текущую локаль
- %x : дата, отформатированная под текущую локаль
- %X : время, форматированное под текущую локаль
Используем различные форматы:
from datetime import datetime now = datetime.now() print(now.strftime("%Y-%m-%d")) # 2017-05-03 print(now.strftime("%d/%m/%Y")) # 03/05/2017 print(now.strftime("%d/%m/%y")) # 03/05/17 print(now.strftime("%d %B %Y (%A)")) # 03 May 2017 (Wednesday) print(now.strftime("%d/%m/%y %I:%M")) # 03/05/17 01:36
При выводе названий месяцев и дней недели по умолчанию используются английские наименования. Если мы хотим использовать текущую локаль, то мы можем ее предварительно установить с помощью модуля locale:
from datetime import datetime import locale locale.setlocale(locale.LC_ALL, "") now = datetime.now() print(now.strftime("%d %B %Y (%A)")) # 03 Май 2017 (среда)
Сложение и вычитание дат и времени
Нередко при работе с датами возникает необходимость добавить к какой-либо дате определенный промежуток времени или, наоборот, вычесть некоторый период. И специально для таких операций в модуле datetime определен класс timedelta . Фактически этот класс определяет некоторый период времени.
Для определения промежутка времени можно использовать конструктор timedelta:
timedelta([days] [, seconds] [, microseconds] [, milliseconds] [, minutes] [, hours] [, weeks])
В конструктор мы последовательно передаем дни, секунды, микросекунды, миллисекунды, минуты, часы и недели.
Определим несколько периодов:
from datetime import timedelta three_hours = timedelta(hours=3) print(three_hours) # 3:00:00 three_hours_thirty_minutes = timedelta(hours=3, minutes=30) # 3:30:00 two_days = timedelta(2) # 2 days, 0:00:00 two_days_three_hours_thirty_minutes = timedelta(days=2, hours=3, minutes=30) # 2 days, 3:30:00
Используя timedelta, мы можем складывать или вычитать даты. Например, получим дату, которая будет через два дня:
from datetime import timedelta, datetime now = datetime.now() print(now) # 2017-05-03 17:46:44.558754 two_days = timedelta(2) in_two_days = now + two_days print(in_two_days) # 2017-05-05 17:46:44.558754
Или узнаем, сколько было времени 10 часов 15 минут назад, то есть фактически нам надо вычесть из текущего времени 10 часов и 15 минут:
from datetime import timedelta, datetime now = datetime.now() till_ten_hours_fifteen_minutes = now - timedelta(hours=10, minutes=15) print(till_ten_hours_fifteen_minutes)
Свойства timedelta
Класс timedelta имеет несколько свойств, с помощью которых мы можем получить временной промежуток:
- days : возвращает количество дней
- seconds : возвращает количество секунд
- microseconds : возвращает количество микросекунд
Кроме того, метод total_seconds() возвращает общее количество секунд, куда входят и дни, и собственно секунды, и микросекунды.
Например, узнаем какой временной период между двумя датами:
from datetime import timedelta, datetime now = datetime.now() twenty_two_may = datetime(2017, 5, 22) period = twenty_two_may - now print("<> дней <> секунд <> микросекунд".format(period.days, period.seconds, period.microseconds)) # 18 дней 17537 секунд 72765 микросекунд print("Всего: <> секунд".format(period.total_seconds())) # Всего: 1572737.072765 секунд
Сравнение дат
Также как и строки и числа, даты можно сравнивать с помощью стандартных операторов сравнения:
from datetime import datetime now = datetime.now() deadline = datetime(2017, 5, 22) if now > deadline: print("Срок сдачи проекта прошел") elif now.day == deadline.day and now.month == deadline.month and now.year == deadline.year: print("Срок сдачи проекта сегодня") else: period = deadline - now print("Осталось <> дней".format(period.days))
Python datetime как прибавить дни
Запись: and-semakin/mytetra_data/master/base/1525418663rd3ocoslig/text.html на raw.githubusercontent.com
Чтобы производить периодические (календарные) арифметические операции над датами в Python, можно использовать класс dateutil.relativedelta .
pip install python-dateutil
from datetime import date
from dateutil.relativedelta import relativedelta # $ pip install python-dateutil
print(date(1920, 1, 10) + relativedelta(years=+100))
- Закодировать файл в base64 на Python
- Рекурсивное создание директорий в Python
- Сортировка в Python
- Правильно добавить год/месяц к дате в Python
- Отформатировать дату в Python
- Получить рабочую директорию и директорию со скриптом в Python
- Копия объекта в Python
- Время выполнения программы на Python
- Конвертировать datetime.timedelta в строку
- Парсинг даты в Python
- Конвертировать строку (str) в булевый тип (bool) в Python
- Получить местный часовой пояс в Python
- Проверить, что строка соответствует регулярному выражению в Python
- Просмотреть доступные версии модулей в PIP
- Получить целочисленный Unix timestamp в Python
- getter и setter в Python
- Настроить формат вывода логов в Python
- Получить переменную окружения в Python
- Обновить пакет в PIP
- Получить имя (хостнейм) машины из Python
- Вывести стэк вызовов при возникновении исключения в Python
- Функция eval в Python
- Дозаписывать (append) в файл в Python
- Препроцессинг кода в Python
- Проверить, что программа установлена из Python
- Настроить путь для импорта библиотек в Python
- Получить размер терминала в символах в Python
- Enum с дополнительными полями в Python
- Ошибка invalid command ‘bdist_wheel’ при установке пакета через PIP
- Получить список аргументов функции из Python
- Сделать словарь только для чтения в Python
- Заматчить любой символ, включая перевод строки, в регулярных выражениях на Python
- Получить список файлов в директории через pathlib в Python
- Вывести действительное число с округлением до нескольких символов после запятой в Python
- Вывод в терминал текста с цветами в Python
- Перезагрузить импортированный модуль в Python
- Безопасно создать список/словарь/любой объект из строкового представления в Python
- Аналог декоратора @property для методов класса в Python
- Перехватить ошибку TimeoutError в asyncio
- Отключить вывод логов в Python
- Уровни логгирования в Python
- Удалить *.pyc и __pycache__ файлы
- Выгрузить объект в JSON в Unicode в Python
- Конвертировать datetime в другую часовую зону в Python
- Дополнить строку нулями в Python
- Вычислить MD5 от строки в Python
- Удалить знаки пунктуации из строки в Python
- Проверить, что первая буква в строке — заглавная, в Python
- Разбить (split) строку по нескольким разделителям в Python
- Отсортировать версии в Python
- Распаковать любой архив в Python
- Получить имя текущего скрипта на Python
- Установка pip на Python 2.6
- Отличить печатаемый символ Unicode от непечатаемого на Python
- Вывести версию интерпретатора Python в машиночитаемом виде
- Найти место, куда Python устанавливает пакеты (dist-packages, site-packages)
Класс date модуля datetime. Работа с датами в Python
Экземпляры, создаваемые от класса date модуля datetime , входящего в стандартную библиотеку языка Python, предназначены для хранения исключительно дат (без времени).
Чтобы создать объект даты непосредственно от date , надо в конструктор класса передать три целочисленных значения – год, месяц и день.
from datetime import date d1 = date(2023, 3, 18) d2 = date(day=10, month=9, year=2022) print(type(d1)) print(d1) print(d2)
2023-03-18 2022-09-10
Тот факт, что даты были выведены в формате YYYY-MM-YY (стандарт ISO 8601), связан с тем, что при вызове функции print языка Python сначала вызывается метод __str__ объекта, который передается в print . В случае date метод __str__ возвращает год, месяц, день экземпляра-даты в виде соответствующей строки.
Если же мы в самом интерпретаторе обратимся к объекту или передадим его в функцию repr , то увидим строку, отражающую его представление как объекта класса date .
У экземпляров date есть свойства year , month , day . Значениями года могут быть целые числа от 1 до 9999. Эти минимально и максимально допустимые года содержатся в константах MAXYEAR и MINYEAR модуля datetime . Месяц и день создаваемой даты также должны находиться в допустимых диапазонах.

С помощью методов weekday и isoweekday можно узнать номер дня недели даты. Разница между методами заключается в старте нумерации с 0 или 1.
from datetime import date d = date(2023, 3, 15) if d.isoweekday() == 7: print("Выходной") else: print("Рабочий")
Объекты date являются неизменяемыми. Другими словами, мы не можем перезаписать значение свойства, например, перейти к следующему дню. Зато у экземпляров есть метод replace , возвращающий новую дату, в которой заменены значения свойств, если соответствующие аргументы передаются, или возвращается другой экземпляр с теми же данными.
from datetime import date d = date(2023, 5, 6) print(d.replace(year=2024)) # 2024-05-06 # дата не изменилась print(d) # 2023-05-06 # переменная связывается с новым объектом date d = d.replace(day=d.day+1) print(d) # 2023-05-07
Для получения сегодняшней даты используется классовый метод today .

Метод fromisoformat класса возвращает экземпляр даты, соответствующий переданной в него строке, представляющей собой дату в ISO-формате. Метод удобно использовать, когда дата, например, вводится пользователем или считывается из файла.
from datetime import date s = input('Введите дату в формате YYYY-MM-DD: ') try: d = date.fromisoformat(s) print('Год:', d.year) print('Месяц:', d.month) print('День:', d.day) print(f'Это -й день недели') except ValueError as e: print(e)
Введите дату в формате YYYY-MM-DD: 2024, 1, 1 Invalid isoformat string: '2024, 1, 1'
Введите дату в формате YYYY-MM-DD: 2023-06-28 Год: 2023 Месяц: 6 День: 28 Это 3-й день недели
Введите дату в формате YYYY-MM-DD: 2021-09-32 day is out of range for month
Если недостаточно вывода в формате ISO, который обеспечивает __str__ и заменяющий его метод isoformat , то более широкие возможности дает strftime . Здесь форматом вывода управляют с помощью определенных кодов.
from datetime import date d = date(2023, 5, 7) print('1:', d) print('2:', d.isoformat()) print('3:', d.strftime("%d-%m-%y")) print('4:', d.strftime("%d %B %Y, %A"))
1: 2023-05-07 2: 2023-05-07 3: 07-05-23 4: 07 May 2023, Sunday
Все коды форматов можно посмотреть в официальной документации.
Даты можно сравнивать между собой и вычислять количество дней между ними.
from datetime import date deadline = date(2023, 5, 31) today = date.today() if today deadline: diff = deadline - today print("Осталось дней:", diff.days) elif today > deadline: diff = today - deadline print("Вы задержали на дней:", diff.days) else: print("Сегодня крайний срок")
Когда из одной даты вычитается другая, возвращается экземпляр типа timedelta , свойство days которого содержит количество дней. Подробно этот класс рассмотрим позже.
В свою очередь к дате можно как прибавлять объект timedelta , так и вычитать. Результатом таких операций является другой экземпляр даты, отстоящий от даты-операнда в будущее или прошлое на количество дней таймдельты.
from datetime import date, timedelta date1 = date.fromisoformat(input("Введите дату YYYY-MM-DD: ")) days = timedelta(int(input("Сколько дней от нее: "))) print("Ваша дата:", date1 + days)
Введите дату YYYY-MM-DD: 2023-08-09 Сколько дней от нее: 2 Ваша дата: 2023-08-11
Введите дату YYYY-MM-DD: 2024-05-10 Сколько дней от нее: -18 Ваша дата: 2024-04-22
Атрибуты класса date (подчеркнуты не упомянутые в уроке):
- данные, хранимые в классе (свойства класса): min , max , resolution
- методы класса: today , fromisoformat , fromtimestamp , fromordinal , fromisocalendar
- свойства экземпляра: day , month , year
- методы экземпляра: replace , weekday , isoweekday , isoformat , strftime , ctime , isocalendar , timetuple , toordinal
X Скрыть Наверх
Даты и время в Python. Курс
Метка: прибавить день
В модуле datatime содержатся классы для работы с датой и временем. В частности часто используются datetime для хранения даты и времени некоторого события и timedelta для хранения интервала времени между каким-то двумя событиями.
Удобно работать с datetime и timedelta путем математических операций.
Примеры. Добавить к дате один день, год или отнять 2:20 (функция str тут для человекочитаемого формата):
>>> str(datetime.now() + timedelta(days=1)) '2019-10-06 15:51:09.089691' >>> str(datetime.now() + timedelta(days=365)) '2020-10-04 15:52:04.618896' >>> str(datetime.now() - timedelta(hours=2, minutes=20)) '2019-10-05 13:41:27.617589'
Разница во времени между событиями:
>>> a = datetime.now() >>> b = datetime.now() + timedelta(minutes=5) >>> b - a datetime.timedelta(0, 317, 99915) >>> str(b - a) '0:05:17.099915'
timedelta внутренне хранит только секунды от начала дня и сами дни, хотя в конструкторе принимает дни, секунды, микросекунды, миллисекунды, минуты, часы и недели (можно выбрать любые их сочетания для задания интервала):
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) >>> str(timedelta(days=1, hours=2, milliseconds=333)) '1 day, 2:00:00.333000'
Причем мы не обязаны нормализовывать аргументы: он сам поймет, что 200 минут – это 3 часа 20 минут:
>>> str(timedelta(minutes=200)) '3:20:00'
Достать часы и минуты (странно, что у объекта нет свойств hours и minutes):
def hours_minutes(td): return td.seconds // 3600, (td.seconds // 60) % 60 >>> hours_minutes(timedelta(0, 12345)) (3, 25)
Сколько всего секунд в интервале:
>>> timedelta(minutes=200, seconds=21, hours=25).total_seconds() 102021.0
Можно даже умножать timedelta на числа или поделить два timedelta или взять остаток. Допустим рабочая смена длится 7 часов 30 минут, сколько полных смен в 3-х сутках?
>>> a = timedelta(days=3) >>> b = timedelta(hours=7, minutes=30) >>> a // b 9 >>> str(a % b) '4:30:00'
Ответ 9 полных смен и еще останется 4 часа 30 минут лишних.
Бонус. Формат даты по-нашенскому (ДД.ММ.ГГГГ):
>>> datetime.strftime(datetime.now(), '%d.%m.%Y') '05.10.2019'
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway
