Сложить datetime.time с datetime.time в python
Доброго времени суток! Прошу подсказать как проще всего сложить переменные tm1 и tm2 в следующем коде:
from datetime import datetime, time tm1 = time(0,30) tm2 = time(1,30) print(tm1 + tm2) # TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'
Отслеживать
задан 5 янв 2020 в 20:02
1 1 1 серебряный знак 1 1 бронзовый знак
а что вы хотите получить? объекты time — это не промежуток времени, а время суток.
5 янв 2020 в 20:35
Вам вероятно нужен объект timedelta – его можно складывать и вычитать друг с другом и с объектами date/time/datetime.
5 янв 2020 в 20:39
Задача получить разницу между временами. На данный момент нашел только одно решение – через timedelta, но возможно подскажите более удобный способ?
5 янв 2020 в 20:40
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Можно использовать timedelta
from datetime import datetime, time, timedelta tm3 = timedelta(hours=0, minutes=30) tm4 = timedelta(hours=1, minutes=30) print(tm3 + tm4) # 2:00:00
Отслеживать
ответ дан 5 янв 2020 в 20:41
1,606 1 1 золотой знак 5 5 серебряных знаков 14 14 бронзовых знаков
Именно так и делаю, другого варианта получается нет?
5 янв 2020 в 20:41
Если результат еще необходимо проверить (tm3 + tm4) > 1h, то аналогично сравнивать с timedelta?
5 янв 2020 в 20:42
@pyok чтобы «по-питонски» скорее всего нет. Если только влоб, сплитовать даты на ч, м, с, складывать и форматировать
5 янв 2020 в 20:43
Понял, спасибо большое.
5 янв 2020 в 20:45
Сравнивать с дельтами тоже, да
5 янв 2020 в 20:45
Если вам нужно сложить два объекта именно типа time , можно использовать вот такой самописный вариант функции сложения времени:
from datetime import time tm1 = time(0,30) tm2 = time(1,30) def sum_time(time1, time2): th1, tm1, ts1 = time1.hour, time1.minute, time1.second th2, tm2, ts2 = time2.hour, time2.minute, time2.second th3, tm3, ts3 = th1 + th2, tm1 + tm2, ts1 + ts2 tm3, ts3 = tm3 + ts3 // 60, ts3 % 60 th3, tm3 = th3 + tm3 // 60, tm3 % 60 # На всякий случай. Вдруг больше дня получится =) th3 = th3 % 24 return time(th3, tm3, ts3) print(tm1, tm2) print(sum_time(tm1, tm2))
00:30:00 01:30:00 02:00:00
Учебник Python/Дата и время
вариант №2 прочитать из строки (не работает в python 2.4.3, там надо использовать модуль time):
datetime.strptime( "2009", "%Y" ) datetime.strptime( "2009-11-12 23:18:53", "%Y-%m-%d %H:%M:%S" )
Операции сложения (timedelta) править
>>> from datetime import datetime, timedelta >>> a = datetime(2010, 12, 12) >>> b = timedelta(days=1, hours=2, seconds=15) >>> str(a) '2010-12-12 00:00:00' >>> str(a+b) '2010-12-13 02:00:15'
time править
Тип для работы с unixtime.
>>> print time.time() 1296734473.66
>>> time.localtime(1360250344) time.struct_time(tm_year=2013, tm_mon=2, tm_mday=7, tm_hour=19, tm_min=19, tm_sec=4, tm_wday=3, tm_yday=38, tm_isdst=0)
Конвертировать datetime в time:
print time.mktime(datetime.now().timetuple())
time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1360250344))
Как складывать время в питоне
Для форматирования объектов 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
Python-программисту, при работе со значениями, представляющими дату и время, часто нужно вычислять длительность временных интервалов. Из этого материала вы узнаете о том, как находить разницу между двумя временными метками, выраженную в часах, минутах и секундах.
А именно, здесь мы коснёмся следующих вопросов:
- Как пользоваться Python-модулем datetime для работы с датой и временем.
- Что собой представляют объекты timedelta и что они могут дать программисту.
- Как вычислять продолжительность временных интервалов, выражая результат в разных единицах измерения.
Python-модуль datetime
Для работы с датой и временем в Python используется модуль datetime . Он является частью стандартной библиотеки Python. Для того чтобы применить этот модуль в своём проекте — достаточно его импортировать:
import datetime
Для вычисления продолжительности временного интервала нужно создать две различных отметки времени. Тут есть несколько вариантов:
- Два объекта date — стандартное представление даты.
- Два объекта time — стандартное представление времени.
- Два объекта datetime , комбинирующие сведения, которые обычно хранятся в объектах date и time .
Создание объектов date
Импортируем класс date из модуля datetime . Для того чтобы создать в Python объект date — можно воспользоваться обычной синтаксической конструкцией вида datetime.date(,,) . Вот пример создания объекта date с именем date1 :
from datetime import date date1 = datetime.date(2022,3,27) print(date1) # Вывод: 2022-03-27
Этот код можно попробовать запустить в онлайн-интерпретаторе Python на Geekflare. Ещё можно установить Python у себя.
Из предыдущего примера видно, что дата выводится в формате YYYY-MM-DD .
Обратите внимание на то, что при создании объекта date месяц надо задавать с использованием целого числа, в начале которого нет дополнительных нулей. Обычно в числовой записи месяцев соответствующие числа дополняют нулями. Здесь же, например, чтобы указать Июнь, то есть — 6 месяц — нужно воспользоваться числом 6, а не 06.
Попробуйте запустить следующий фрагмент кода. Тут месяц намеренно записан неправильно — 03 вместо 3. Из-за этого возникает ошибка SyntaxError :
date1 = datetime.date(2022,03,27) print(date1) # Сообщение об ошибке File "", line 1 date1 = datetime.date(2022,03,27) ^ SyntaxError: invalid token
Поговорим теперь о том, как создавать объекты time .
Создание объектов time
Для создания объектов time импортируем класс time . При создании таких объектов указывают следующие атрибуты класса: hour , minute , second и microsecond . Они, соответственно, позволяют указывать часы, минуты, секунды и микросекунды.
Правда, все эти атрибуты являются необязательными. Если какой-то из них опустить, предположим — second , то он, по умолчанию, будет установлен в 0.
В следующем примере показано создание объекта time с именем time1 . Так же, как и при работе с объектами date , объекты time можно выводить в консоль:
from datetime import time time1 = datetime.time(13,27,45,4600) print(time1) # Вывод: 13:27:45.004600
Создание объектов datetime
Как видите, объекты типа date не содержат сведений о времени. А в объектах time нет информации о дате.
Но на практике обычно нужны данные и о дате, и о времени. Поэтому вместо двух вышеописанных классов рекомендуется прибегнуть к классу datetime .
Обратиться к этому классу и создать соответствующий объект ( dt1 ) можно так:
dt1 = datetime.datetime(2022,3,27,13,27,45,46000) print(dt1) # Вывод: 2022-03-27 13:27:45.046000
Создадим ещё один объект datetime и дадим ему имя dt2 , опустив при его создании атрибут second . Это приведёт к тому, что он будет установлен в значение по умолчанию — 0.
dt2 = datetime.datetime(2022,6,30,14,28) print(dt2) # Вывод: 2022-06-30 14:28:00
Итак, теперь вы знаете о том, как создавать Python-объекты date , time и datetime , представляющие отметки времени. Пришло время поговорить о том, как находить длительность временных интервалов.
Применение объектов timedelta
В Python объекты timedelta представляют собой сведения о промежутках времени. Это — разница двух объектов date , time или datetime .
Если сложить или вычесть два объекта date , time или datetime , получится объект timedelta . У этого объекта имеются полезные атрибуты и методы, которые могут помочь в деле нахождения длительности временных интервалов.
Посчитаем длительность интервала, задаваемого двумя объектами типа datetime — dt1 и dt2 :
dt1 = datetime.datetime(2022,3,27,13,27,45,46000) dt2 = datetime.datetime(2022,6,30,14,28) tdelta = dt2 - dt1 print(tdelta) print(type(tdelta)) # Вывод 95 days, 1:00:14.954000
Видно, что переменная tdelta хранит разницу между dt1 и dt2 . Тут, кроме того, пользуясь встроенной Python-функцией type() , мы проверили тип tdelta . Это — timedelta .
Проведём ещё один эксперимент.
Нахождение временного промежутка между двумя датами
Рассмотрим простой, но интересный пример.
Задача заключается в том, чтобы получить временную разницу между текущей датой (сегодняшним днём) и днём вашего рождения.
Для того чтобы её решить — надо сформировать первую отметку времени, указывающую на сегодняшний день, и вторую, указывающую на дату дня рождения.
Создадим пару объектов datetime :
- Первый будет хранить сегодняшнюю дату, мы назовём его today .
- Второй будет хранить дату дня рождения. Назовём его bday .
today = datetime.datetime.now() print(today) # Пример вывода: 2022-01-22 09:10:18.489538
Пробуя следующий код, замените значение, попадающее в bday , на дату своего дня рождения текущего года. Это позволит узнать о том, сколько времени вам ещё его ждать в этом году.
Если же ваш день рождения в этом году уже прошёл, можете записать в bday дату из следующего года.
bday = datetime.datetime(2022,8,30,11,59) print(bday) # Пример вывода: 2022-08-30 11:59:00
Следующий шаг нашей работы — нахождение разницы между двумя отметками времени. Её мы будем хранить в переменной time_diff . Подобные переменные, как мы уже говорили, имеют тип timedelta . Нам достаточно вычесть today из bday .
time_diff = bday - today print(f"Your birthday is in ") # Вывод Your birthday is in 220 days, 2:46:00.127416
Для того чтобы узнать о том, сколько полных дней осталось до дня рождения, можно воспользоваться атрибутом days объекта типа timedelta .
tdays = time_diff.days print(f"Your birthday is in days.") # Вывод Your birthday is in 220 days.
Выражение длительности временных промежутков в секундах
Теперь узнаем о том, сколько ждать дня рождения, выразив результат в секундах.
Для этого можно воспользоваться методом total_seconds() объекта типа timedelta . В следующем примере это — всё тот же объект time_diff .
tsecs = time_diff.total_seconds() print(f"Your birthday is seconds away.") # Вывод Your birthday is 19017960.127416 seconds away.
Да, дня рождения придётся подождать!
Теперь вы знаете о том, как вычислять промежутки времени и выражать их в секундах.
Давайте вспомним то, что мы знаем о времени, и поговорим об измерении времени в днях, часах, минутах и секундах. В сутках 24 часа, в часе 60 минут, а 60 секунд — это минута.
Часы, минуты и секунды
Для перехода от секунд к минутам, дням или часам, можно воспользоваться следующей таблицей, деля значение в секундах на соответствующий коэффициент преобразования.
Из | В | Делим на |
Секунд | Минуты | 60 |
Секунд | Часы | 60*60 |
Секунд | Дни | 60*60*24 |
Воспользуемся этими знаниями.
Выражение длительности временных промежутков в минутах
Для того чтобы, имея данные о длительности промежутка времени, выраженные в секундах, узнать его длительность в минутах, нужно разделить общее число секунд на 60.
Разделим то, что хранится в переменной tsecs , на 60, и сохраним то, что получится, в переменной tmins :
tmins = tsecs/60 print(f"Your birthday is minutes away.") # Вывод Your birthday is 316966.0021236 minutes away.
Выражение длительности временных промежутков в часах
Теперь посчитаем длительность временного промежутка, выраженную в часах. Учитывая то, что у нас уже есть значение, выраженное в минутах, для достижения этой цели его можно просто поделить на 60. Или можно поделить значение, выраженное в секундах, на 3600 (60*60).
thrs = tsecs/(60*60) print(f"Your birthday is hours away.") # Вывод Your birthday is 5282.76670206 hours away.
Теперь вы знаете о том, как представлять разные промежутки времени в нужном вам виде.
Итоги
Освоив это руководство, вы узнали следующее:
- Как создавать объекты, содержащие сведения о дате и времени, пользуясь модулем datetime , и как работать с такими объектами.
- Как пользоваться объектами типа timedelta для нахождения длительности временных промежутков или разницы между двумя объектами, содержащими сведения о дате или времени.
- Как выражать длительность временных промежутков в секундах, минутах и часах.
Какие задачи вы решаете с помощью Python?