Как найти промежуток времени в python

Время на прочтение
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. У этого объекта имеются полезные атрибуты и методы, которые могут помочь в деле нахождения длительности временных интервалов.

Посчитаем длительность интервала, задаваемого двумя объектами типа datetimedt1 и 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.

  1. 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.

  2. 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.

  3. 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.

  4. Get time difference in seconds

    To get a time difference in seconds, use the timedelta.total_seconds() methods.

  5. Get time difference in milliseconds

    Multiply the total seconds by 1000 to get the time difference in milliseconds.

  6. Get time difference in minutes

    Divide the seconds by 60 to get the difference in minutes.

  7. 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

Понравилась статья? Поделить с друзьями:
  • Как найти проститутку в оренбурге
  • Fatal error call of chernobyl как исправить
  • Алгебра как найти сумму геометрической прогрессии
  • Как исправить рис если он получился клейким
  • Как найти почту с факсами