Время на прочтение
6 мин
Количество просмотров 34K
Python-программисту, при работе со значениями, представляющими дату и время, часто нужно вычислять длительность временных интервалов. Из этого материала вы узнаете о том, как находить разницу между двумя временными метками, выраженную в часах, минутах и секундах.
А именно, здесь мы коснёмся следующих вопросов:
- Как пользоваться Python-модулем
datetime
для работы с датой и временем. - Что собой представляют объекты
timedelta
и что они могут дать программисту. - Как вычислять продолжительность временных интервалов, выражая результат в разных единицах измерения.
Python-модуль datetime
Для работы с датой и временем в Python используется модуль datetime
. Он является частью стандартной библиотеки Python. Для того чтобы применить этот модуль в своём проекте — достаточно его импортировать:
import datetime
Для вычисления продолжительности временного интервала нужно создать две различных отметки времени. Тут есть несколько вариантов:
- Два объекта
date
— стандартное представление даты. - Два объекта
time
— стандартное представление времени. - Два объекта
datetime
, комбинирующие сведения, которые обычно хранятся в объектахdate
иtime
.
Создание объектов date
Импортируем класс date
из модуля datetime
. Для того чтобы создать в Python объект date
— можно воспользоваться обычной синтаксической конструкцией вида datetime.date(<year>,<month>,<day>)
. Вот пример создания объекта 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 "<ipython-input-12-6eb72084e6ce>", 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
<class 'datetime.timedelta'>
Видно, что переменная tdelta
хранит разницу между dt1
и dt2
. Тут, кроме того, пользуясь встроенной Python-функцией type()
, мы проверили тип tdelta
. Это — timedelta
.
Проведём ещё один эксперимент.
Нахождение временного промежутка между двумя датами
Рассмотрим простой, но интересный пример.
Задача заключается в том, чтобы получить временную разницу между текущей датой (сегодняшним днём) и днём вашего рождения.
Для того чтобы её решить — надо сформировать первую отметку времени, указывающую на сегодняшний день, и вторую, указывающую на дату дня рождения.
Создадим пару объектов datetime
:
- Первый будет хранить сегодняшнюю дату, мы назовём его
today
. - Второй будет хранить дату дня рождения. Назовём его
bday
.
У класса datetime
есть метод now()
, который позволяет создавать объекты, содержащие сведения о текущем местном времени и дате. Воспользуемся этим методом для того чтобы получить сегодняшнюю дату, играющую роль точки отсчёта:
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 {time_diff}")
# Вывод
Your birthday is in 220 days, 2:46:00.127416
Для того чтобы узнать о том, сколько полных дней осталось до дня рождения, можно воспользоваться атрибутом days
объекта типа timedelta
.
tdays = time_diff.days
print(f"Your birthday is in {tdays} days.")
# Вывод
Your birthday is in 220 days.
Выражение длительности временных промежутков в секундах
Теперь узнаем о том, сколько ждать дня рождения, выразив результат в секундах.
Для этого можно воспользоваться методом total_seconds()
объекта типа timedelta
. В следующем примере это — всё тот же объект time_diff
.
tsecs = time_diff.total_seconds()
print(f"Your birthday is {tsecs} seconds away.")
# Вывод
Your birthday is 19017960.127416 seconds away.
Да, дня рождения придётся подождать!
Теперь вы знаете о том, как вычислять промежутки времени и выражать их в секундах.
Давайте вспомним то, что мы знаем о времени, и поговорим об измерении времени в днях, часах, минутах и секундах. В сутках 24 часа, в часе 60 минут, а 60 секунд — это минута.
Часы, минуты и секунды
Для перехода от секунд к минутам, дням или часам, можно воспользоваться следующей таблицей, деля значение в секундах на соответствующий коэффициент преобразования.
Воспользуемся этими знаниями.
Выражение длительности временных промежутков в минутах
Для того чтобы, имея данные о длительности промежутка времени, выраженные в секундах, узнать его длительность в минутах, нужно разделить общее число секунд на 60.
Разделим то, что хранится в переменной tsecs
, на 60, и сохраним то, что получится, в переменной tmins
:
tmins = tsecs/60
print(f"Your birthday is {tmins} minutes away.")
# Вывод
Your birthday is 316966.0021236 minutes away.
Выражение длительности временных промежутков в часах
Теперь посчитаем длительность временного промежутка, выраженную в часах. Учитывая то, что у нас уже есть значение, выраженное в минутах, для достижения этой цели его можно просто поделить на 60. Или можно поделить значение, выраженное в секундах, на 3600 (60*60).
thrs = tsecs/(60*60)
print(f"Your birthday is {thrs} hours away.")
# Вывод
Your birthday is 5282.76670206 hours away.
Теперь вы знаете о том, как представлять разные промежутки времени в нужном вам виде.
Итоги
Освоив это руководство, вы узнали следующее:
- Как создавать объекты, содержащие сведения о дате и времени, пользуясь модулем
datetime
, и как работать с такими объектами. - Как пользоваться объектами типа
timedelta
для нахождения длительности временных промежутков или разницы между двумя объектами, содержащими сведения о дате или времени. - Как выражать длительность временных промежутков в секундах, минутах и часах.
Надеюсь, вам пригодится то, о чём вы узнали. Теперь эти знания вполне можно применить на практике.
Какие задачи вы решаете с помощью Python?
Here’s a solution that supports finding the difference even if the end time is less than the start time (over midnight interval) such as 23:55:00-00:25:00
(a half an hour duration):
#!/usr/bin/env python
from datetime import datetime, time as datetime_time, timedelta
def time_diff(start, end):
if isinstance(start, datetime_time): # convert to datetime
assert isinstance(end, datetime_time)
start, end = [datetime.combine(datetime.min, t) for t in [start, end]]
if start <= end: # e.g., 10:33:26-11:15:49
return end - start
else: # end < start e.g., 23:55:00-00:25:00
end += timedelta(1) # +day
assert end > start
return end - start
for time_range in ['10:33:26-11:15:49', '23:55:00-00:25:00']:
s, e = [datetime.strptime(t, '%H:%M:%S') for t in time_range.split('-')]
print(time_diff(s, e))
assert time_diff(s, e) == time_diff(s.time(), e.time())
Output
0:42:23
0:30:00
time_diff()
returns a timedelta object that you can pass (as a part of the sequence) to a mean()
function directly e.g.:
#!/usr/bin/env python
from datetime import timedelta
def mean(data, start=timedelta(0)):
"""Find arithmetic average."""
return sum(data, start) / len(data)
data = [timedelta(minutes=42, seconds=23), # 0:42:23
timedelta(minutes=30)] # 0:30:00
print(repr(mean(data)))
# -> datetime.timedelta(0, 2171, 500000) # days, seconds, microseconds
The mean()
result is also timedelta()
object that you can convert to seconds (td.total_seconds()
method (since Python 2.7)), hours (td / timedelta(hours=1)
(Python 3)), etc.
In this article, we will discuss how to find the gap between two times in Python.
If we want to know the difference at which some particular events has occurred then we should know the time gap between them.
Example:
Input: Start time is : 06:20:50, End time is : 11:56:18 Output: Time difference in seconds is 20128.0 seconds Explanation: The time difference between the two times is 20128 seconds.
We will discuss the following topics:
- Calculate the time difference in hours, minutes and seconds
- Calculate the time interval between two given times
- Using the divmod( ) function
Calculate the time difference in hours, minutes and seconds
For finding differences in hours, minutes and seconds we will perform the following actions:
- We will import daytime from daytime module
- We will have start and end time of event
- Then calculate the difference between them
- And finally calculate the difference in hours, minutes and seconds
Python3
from
datetime
import
datetime
start
=
datetime.strptime(
"4:25:40"
,
"%H:%M:%S"
)
end
=
datetime.strptime(
"11:40:10"
,
"%H:%M:%S"
)
difference
=
end
-
start
seconds
=
difference.total_seconds()
print
(
'difference in seconds is:'
, seconds)
minutes
=
seconds
/
60
print
(
'difference in minutes is:'
, minutes)
hours
=
seconds
/
(
60
*
60
)
print
(
'difference in hours is:'
, hours)
Output:
difference in seconds is: 26070.0 difference in minutes is: 434.5 difference in hours is: 7.241666666666666
Calculate the time interval between two given times
Now we will calculate the time difference in seconds between two given times.
We will perform the following actions:
- Import daytime from daytime module
- We will have a start time and end time
- Calculate the difference
- Finally, calculate the difference in seconds
Python3
from
datetime
import
datetime
start
=
"2:13:57"
end
=
"11:46:38"
time1
=
datetime.strptime(
"6:20:50"
,
"%H:%M:%S"
)
print
(
'Start time is :'
, time1.time())
time2
=
datetime.strptime(
"11:56:18"
,
"%H:%M:%S"
)
print
(
'End time is :'
, time2.time())
delta
=
time2
-
time1
print
(
"Time difference in seconds is"
, delta.total_seconds(),
"seconds"
)
Output:
Start time is : 06:20:50 End time is : 11:56:18 Time difference in seconds is 20128.0 seconds
Using the divmod( ) function
We can get a more precise time difference using the divmod( ) function. Using this function get the difference in a number of days also.
Python3
import
datetime
time1
=
datetime.datetime(
2018
,
10
,
12
,
20
,
15
,
40
)
time2
=
datetime.datetime(
2015
,
2
,
10
,
15
,
41
,
30
)
difference
=
time1
-
time2
print
(
'Difference is : '
, difference)
minutes
=
divmod
(difference.total_seconds(),
60
)
print
(
'Difference in minutes: '
, minutes[
0
],
'minutes'
, minutes[
1
],
'seconds'
)
minutes
=
divmod
(difference.seconds,
60
)
print
(
'Total difference in minutes: '
, minutes[
0
],
'minutes'
,minutes[
1
],
'seconds'
)
Output:
Difference is : 1340 days, 4:34:10 Difference in minutes: 1929874.0 minutes 10.0 seconds Total difference in minutes: 274 minutes 10 seconds
Finding the execution time of a program
Now we will discuss how we can find the total time taken by the program to be executed.
Python3
from
datetime
import
datetime
start_time
=
datetime.now()
for
i
in
range
(
10000
):
i
*
*
100
end_time
=
datetime.now()
time_difference
=
(end_time
-
start_time).total_seconds()
*
10
*
*
3
print
(
"Execution time of program is: "
, time_difference,
"ms"
)
Output:
Execution time of program is: 24.488 ms
Last Updated :
30 Dec, 2022
Like Article
Save Article
In this article, you’ll learn how to find the time difference between two-time in Python. For example, we want to measure the execution time of a program. Here, we need to calculate the time difference between the program’s start and end times.
Another example is we may need to capture the time change between the two events. We need to subtract one time/timestamp from another to calculate the time difference between two-time.
After reading this Python article, you’ll learn:
- How to calculate the time interval between the two-time strings.
- get time difference in seconds, minutes, and hours
- Get the time difference between two timestamps in Python
Also, see how to get the difference between two dates in days in Python.
Table of contents
- How to get the time difference between two-time in Python
- Example: Calculate Time Difference in Python
- Get time difference in hours and minutes
- Time Difference between two timestamps in Python
How to get the time difference between two-time in Python
For example, you have a start time and stop time in the format of “10:33:26” (HH:MM:SS
). The below steps show how to calculate the time difference in hours, minutes, and seconds between two-time in Python.
- Import datetime module
Python datetime module provides various functions to create and manipulate the date and time. Use the
from datetime import datetime
statement to import a datetime class from a datetime module. - Convert time strings to a datetime object
We have time data in a string format. Before calculating the difference, we need to convert both time strings to a datetime object.
Use the strptime(time_str, format) function to convert a time string into a datetime object as per the corresponding format. The format codes are standard directives for mentioning the string format for parsing. For example, the%H:%M:%S
format codes are for hours, minutes, and seconds. - Subtract the end time from the start time
To get the difference between two-time, subtract time1 from time2. A result is a timedelta object. The timedelta represents a duration which is the difference between two-time to the microsecond resolution.
- Get time difference in seconds
To get a time difference in seconds, use the
timedelta.total_seconds()
methods. - Get time difference in milliseconds
Multiply the total seconds by 1000 to get the time difference in milliseconds.
- Get time difference in minutes
Divide the seconds by 60 to get the difference in minutes.
- Get time difference in hours
Divide the seconds by 3600 to get the final result in hours.
Example: Calculate Time Difference in Python
In this example, we will see how to calculate the seconds and milliseconds between two-time.
from datetime import datetime
# start time
start_time = "2:13:57"
end_time = "11:46:38"
# convert time string to datetime
t1 = datetime.strptime(start_time, "%H:%M:%S")
print('Start time:', t1.time())
t2 = datetime.strptime(end_time, "%H:%M:%S")
print('End time:', t2.time())
# get difference
delta = t2 - t1
# time difference in seconds
print(f"Time difference is {delta.total_seconds()} seconds")
# time difference in milliseconds
ms = delta.total_seconds() * 1000
print(f"Time difference is {ms} milliseconds")
Output:
Start time: 02:13:57 End time: 11:46:38 Time difference is 34361.0 seconds Time difference is 34361000.0 milliseconds
Get time difference in hours and minutes
Note: To calculate the time difference in minutes and hours use the below formulas.
- First, use the above example to get the time difference in seconds between two-time.
- Next, divide the seconds by 60 to get the get time difference in minutes.
- In the end, divide the seconds by 3600 (60*60) to get the time difference in hours.
Example: To get the time difference in hours and minutes between two-time.
from datetime import datetime
# start time and end time
start_time = datetime.strptime("2:13:57", "%H:%M:%S")
end_time = datetime.strptime("11:46:38", "%H:%M:%S")
# get difference
delta = end_time - start_time
sec = delta.total_seconds()
print('difference in seconds:', sec)
min = sec / 60
print('difference in minutes:', min)
# get difference in hours
hours = sec / (60 * 60)
print('difference in hours:', hours)
Output:
difference in seconds: 34361.0 difference in minutes: 572.6833333333333 difference in hours: 9.544722222222223
Time Difference between two timestamps in Python
A timestamp is encoded information generally used in UNIX, which indicates the date and time at which a particular event has occurred.
Now, let’s see how to find the difference between the two timestamps in hours, minutes, and seconds.
- First, store the start timestamp in the ‘start’ variable and the end timestamp in the ‘end’ variable.
- Next, use the
fromtimestamp()
method to convert both start and end timestamps to datetime objects. We convert these timestamps to datetime because we want to subtract one timestamp from another. - Next, subtract datetime2 from datetime1 to get the difference between two timestamps in the form of timedelta
- Next, use the
total_seconds()
method to get the difference in seconds.
Example 1: Difference between two timestamps in HH:MM:SS
format.
from datetime import datetime
# start and end timestamps
start_ts = 1652426243.907874
end_ts = 1652436243.907874
# convert timestamps to datetime object
dt1 = datetime.fromtimestamp(start_ts)
print('Datetime Start:', dt1)
dt2 = datetime.fromtimestamp(end_ts)
print('Datetime End:', dt2)
# Difference between two timestamps
# in hours:minutes:seconds format
delta = dt2 - dt1
print('Difference is:', delta)
Output:
Datetime Start: 2022-05-13 12:47:23.907874 Datetime End: 2022-05-13 15:34:03.907874 Difference is: 2:46:40
The output shows the difference between the two timestamps is 2 hours, 46 minutes, and 40 seconds.
Difference between two timestamps in seconds
Use the below example to get the total seconds between two timestamps.
Example:
from datetime import datetime
# convert timestamps to datetime object
start_ts_ = datetime.fromtimestamp(1652426243.907874)
print('Datetime Start:', start_ts_)
end_ts = datetime.fromtimestamp(1652436243.907874)
print('Datetime End:', end_ts)
# Difference between two timestamps in seconds
delta = end_ts - start_ts_
print('Difference is seconds:', delta.total_seconds())
Output:
Datetime Start: 2022-05-13 12:47:23.907874 Datetime End: 2022-05-13 15:34:03.907874 Difference is seconds: 10000.0
Python Exercises and Quizzes
Free coding exercises and quizzes cover Python basics, data structure, data analytics, and more.
- 15+ Topic-specific Exercises and Quizzes
- Each Exercise contains 10 questions
- Each Quiz contains 12-15 MCQ
Мы уже сталкивались с объектами timedelta
, выполняя операции с экземплярами date
и datetime
, а также при установке часового пояса. Сами по себе промежутки времени не имеют привязки к какой-либо дате или времени суток. Они лишь представляют собой отрезок или вектор времени, который может быть не только абсолютным, но и направленным в прошлое или будущее. Аналогично фразам: «через четыре дня», «пять минут назад», «пробежал дистанцию за 50 секунд».
Все аргументы, передаваемые в конструктор класса, являются опциональными. Если ничего не передавать, то создаваемый объект будет описывать промежуток времени длинной в ноль единиц. Такой объект в логических операциях превращается в False
.
В остальных случаях для создаваемого отрезка времени можно указать количество недель, дней, часов, минут, секунд, миллисекунд и микросекунд. Если микросекунда равна одной миллионной доли секунды, то миллисекунда – более крупная единица и соответствует одной тысячной секунды.
from datetime import timedelta a = timedelta(days=100) b = timedelta(days=1, hours=15, minutes=30) c = timedelta(weeks=3, days=5) d = timedelta(seconds=5, milliseconds=1230, microseconds=590) print(a) # 100 days, 0:00:00 print(b) # 1 day, 15:30:00 print(c) # 26 days, 0:00:00 print(d) # 0:00:06.230590
Когда таймдельта выводится с помощью print()
, неявно вызывается метод __str__()
объекта, который приводит данные в такой формат, в котором есть дни, часы, минуты и секунды (микросекунды выражаются дробной частью секунды).
Однако, если мы посмотрим как данные хранятся в самом объекте, например, командой print(a.__repr__()
, то увидим, что там есть только свойства days
, seconds
, microseconds
:
datetime.timedelta(days=100) datetime.timedelta(days=1, seconds=55800) datetime.timedelta(days=26) datetime.timedelta(seconds=6, microseconds=230590)
Дело в том, что аргументы, переданные в конструктор при создании экземпляра, в классе преобразуются и сводятся в эти три свойства. Количество микросекунд не может превышать 999999. Если получается больше, то из микросекунд выделяются секунды. Количество секунд не должно быть больше 86399 (в часе 3600 секунд, в сутках 24 часа). Иначе происходит конвертация в дни.
from datetime import timedelta a = timedelta(seconds=86399) b = timedelta(seconds=86400) print(a) # 23:59:59 print(b) # 1 day, 0:00:00 print(repr(a)) # datetime.timedelta(seconds=86399) print(repr(b)) # datetime.timedelta(days=1)
Что касается свойства days
, то его пределы от -999999999 до 99999999 включительно (девять девяток).
Столько дней – это огромный промежуток времени – более 2 миллионов лет (а сейчас только начало третьего тысячелетия нашей эры). Поэтому если добавить слишком большую таймдельту к дате, произойдет выброс OverflowError
, так как максимальный год в объектах типа date
и datetime
– это 9999. Кроме того, год не может равняться нулю или быть отрицательным (нельзя уйти в период до нашей эры).
С другой стороны, у экземпляров timedelta
количество дней может быть отрицательным. Как минимум это необходимо, чтобы отражать разницу между датами, когда первая является прошлым по отношению к вычитаемой дате.
from datetime import datetime a = datetime.today() new_year = datetime(a.year, 1, 1) print(f'Событие произошло {new_year - a} назад')
Пример выполнения:
Событие произошло -143 days, 23:52:31.081623 назад
Несмотря на то, что у timedelta
свойства seconds
и microseconds
экземпляров не могут быть отрицательными, в конструктор можно передавать отрицательные аргументы для всех параметров.
from datetime import timedelta a = timedelta(hours=-8, minutes=30, seconds=-20) print(a) # -1 day, 16:29:40 print(a.__repr__()) # datetime.timedelta(days=-1, seconds=59380)
Это возможно из-за того, что аргументы не сразу присваиваются полям, а происходит их преобразование.
Если пренебречь аргументом seconds
в примере выше, то -8 часов +30 минут дают -7 с половиной часов. Чтобы получить такой промежуток времени во внутреннем представлении таймдельты, надо к минус одному дню (-24 часа) прибавить +59400 секунд, то есть +16 с половиной часов.
Характерной чертой типа timedelta
являются арифметические операции, в которых могут участвовать его объекты.
Операции с date
и datetime
уже были упомянуты в предыдущих уроках. Вспомним, что из одной даты можно вычитать другую с получением объекта типа timedelta
, также к дате можно добавлять (вычитать) таймдельту с получением другой даты (здесь под датой имеются в виду в том числе объекты datetime
– дата со временем).
Теперь обратимся к «взаимодействиям» таймдельт между собой и с числами.
Экземпляры timedelta
можно складывать между собой, вычитать из одного другой, делить один на другой. Нельзя перемножать.
from datetime import timedelta a = timedelta(hours=17) b = timedelta(days=1) plus = a + b minus = a - b print(plus) # 1 day, 17:00:00 print(minus) # -1 day, 17:00:00 print(plus == timedelta(hours=41)) # True print(minus == timedelta(hours=-7)) # True
В примере выше значения переменных plus и minus только на первый взгляд выглядят обратными друг другу. На самом деле положительное значение соответствует количеству часов 41, отрицательное – минус семи часам: 17 часов — 24 часа (1 день) = -7 часов.
Если все же требуется поменять направление вектора времени на обратное, это можно сделать с помощью унарного минуса. Функции abs()
изменяет значение, только если оно отрицательное.
from datetime import timedelta a = timedelta(days=-2, hours=-9) print(-a, end='nn') # 2 days, 9:00:00 b = timedelta(hours=20, minutes=50) c = -b print(c) # -1 day, 3:10:00 print(b) # 20:50:00 print(abs(b) == abs(c)) # True
Допустим, мы хотим узнать, сколько раз один промежуток времени укладывается в другой. Например, сколько отрезков в 45 минут содержится в 7 часах, или какую долю составляют 40 минут от 3 часов. Для решения подобных задач используются операции деления, как истинного, так и целочисленного, а также нахождение остатка.
from datetime import timedelta total = timedelta(hours=7) unit = timedelta(minutes=45) qty = total / unit print(qty) # 9.333333333333334 print(type(qty)) # <class 'float'> qty = total // unit print(qty) # 9 print(type(qty)) # <class 'int'> r = total % unit print(r) # 0:15:00 print(type(r)) # <class 'datetime.timedelta'> qty, r = divmod(total, unit) print(qty, r) # 9 0:15:00 print(timedelta(minutes=30) / timedelta(hours=1.5)) # 0.3333333333333333
Обратите внимание, что класс timedelta
умеет работать с вещественными числами. В последнем делении мы передаем аргументу hours
вещественное число. В данном случае hours=1.5
соответствует hours=1, minutes=30
. Что касается результата, то полчаса от полутора часов составляют одну треть, то есть 0.333…
.
Хотя одну таймдельту нельзя умножать на другую, ее можно перемножить с целым или вещественным числом. Выполняя подобное действие, мы как бы повторяем заданный промежуток времени n раз, то есть увеличиваем его в n раз. Либо находим долю, если n – вещественное число.
from datetime import timedelta a = timedelta(days=2, hours=6, minutes=30) b = a * 3 print(b) # 6 days, 19:30:00 c = a * 0.5 print(c) # 1 day, 3:15:00
При сравнении промежутков времени между собой следует иметь в виду, что объект с отрицательным значением (вектор направленный в прошлое) всегда меньше нулевого отрезка времени.
from datetime import timedelta a = timedelta(seconds=-100) zero = timedelta(seconds=0) b = timedelta(seconds=100) print(a < zero < b) # True