from dateutil.relativedelta import relativedelta
dt1 = datetime(2023, 1, 1, 10, 0, 0)
dt2 = datetime(2023, 1, 10, 12, 30, 0)
rd = relativedelta(dt2, dt1)
print(f"Разница: {rd.days} дней, {rd.hours} часов, {rd.minutes} минут")
Она подходит для человеко-ориентированных расчетов.
import pandas as pd
ts1 = pd.Timestamp('2023-01-01 10:00:00')
ts2 = pd.Timestamp('2023-01-10 12:30:00')
# Например, вычисление разницы в рабочих днях (без выходных)
workday_count = len(pd.bdate_range(ts1, ts2))
print(f"Количество рабочих дней: {workday_count}")
Pandas полезна для работы с временными рядами и расчетов с учетом бизнес-логики (например, праздники).
Вопрос: Как вычислить разницу между временными метками с учетом нестандартных временных интервалов?
Ответ: Вычисление разницы между временными метками, особенно при учете нестандартных интервалов (например, рабочие дни, определенные часы работы, исключая праздники), требует более сложного подхода, чем простое вычитание.
Основные стратегии и инструменты:
datetime
и timedelta
: Для базовых операций, таких как вычитание дат и времен, datetime
и timedelta
из стандартной библиотеки Python вполне подходят. Например:
from datetime import datetime, timedelta
start_time = datetime(2023, 10, 26, 9, 0, 0)
end_time = datetime(2023, 10, 26, 17, 0, 0)
difference = end_time - start_time # timedelta object
print(difference) # Выведет: 8:00:00
print(difference.total_seconds()) # Выведет разницу в секундах
Однако, они не учитывают рабочие дни, праздники и другие нестандартные интервалы.
dateutil
: dateutil
расширяет возможности datetime
и предоставляет парсеры дат, относительные дельты времени (relativedelta
), которые могут быть полезны для более сложных операций, например добавления месяцев или лет.
from datetime import datetime
from dateutil.relativedelta import relativedelta
start_time = datetime(2023, 10, 26)
end_time = datetime(2023, 11, 26)
difference = relativedelta(end_time, start_time)
print(difference.months) # Выведет: 1
pandas
: pandas
предлагает мощные инструменты для работы с временными рядами, включая Timedelta
, Timestamp
и DateOffset
. Особенно полезна для операций с данными, которые требуют анализа временных интервалов на основе определенных правил.
import pandas as pd
start_time = pd.Timestamp('2023-10-26')
end_time = pd.Timestamp('2023-10-28')
difference = end_time - start_time
print(difference) # Выведет: 2 days 00:00:00
print(difference.days) # Выведет: 2
workalendar
: workalendar
специально разработана для работы с календарями, учитывающими рабочие дни и праздники. Она позволяет вычислять разницу между датами, исключая нерабочие дни. Поддерживает календари для различных стран и регионов.
from datetime import date
from workalendar.usa import UnitedStates
cal = UnitedStates()
start_date = date(2023, 10, 26)
end_date = date(2023, 11, 2)
working_days = cal.get_working_days_delta(start_date, end_date)
print(working_days) # Выведет количество рабочих дней между датами, исключая праздники.
workalendar
для определения рабочих дней, а затем вручную итерироваться по дням и часам, учитывая заданные интервалы работы и обеденные перерывы.
from datetime import datetime, timedelta
from workalendar.usa import UnitedStates
def calculate_working_time(start_time, end_time, work_start_hour=9, work_end_hour=17):
cal = UnitedStates()
total_working_time = timedelta()
current_date = start_time.date()
while current_date <= end_time.date():
if cal.is_working_day(current_date):
workday_start = datetime(current_date.year, current_date.month, current_date.day, work_start_hour, 0, 0)
workday_end = datetime(current_date.year, current_date.month, current_date.day, work_end_hour, 0, 0)
# Учитываем пересечения со временем начала и конца
day_start = max(start_time, workday_start)
day_end = min(end_time, workday_end)
if day_start < day_end:
total_working_time += (day_end - day_start)
current_date += timedelta(days=1)
return total_working_time
start_time = datetime(2023, 10, 26, 10, 0, 0)
end_time = datetime(2023, 10, 27, 16, 0, 0)
working_time = calculate_working_time(start_time, end_time)
print(working_time)
Рекомендации:
datetime
и timedelta
.workalendar
идеальна для учета рабочих дней и праздников.pandas
подходит для анализа временных рядов и работы с большим объемом данных.