Timedelta for business time. Supports exact amounts of time (hours, seconds), custom schedules, holidays, and time zones.
Project description
BusinessTimeDelta
Python's timedelta for business time. This module helps you calculate the exact working time between two datetimes. It supports common scenarios such as custom schedules, holidays, and time zones.
Installation
Use pip to install BusinessTimeDelta.
pip install businesstimedelta
Example Use
Define your business hours
import datetime
import pytz
import businesstimedelta
# Define a working day
workday = businesstimedelta.WorkDayRule(
start_time=datetime.time(9),
end_time=datetime.time(18),
working_days=[0, 1, 2, 3, 4])
# Take out the lunch break
lunchbreak = businesstimedelta.LunchTimeRule(
start_time=datetime.time(12),
end_time=datetime.time(13),
working_days=[0, 1, 2, 3, 4])
# Combine the two
businesshrs = businesstimedelta.Rules([workday, lunchbreak])
Calculate the business time between two datetimes
start = datetime.datetime(2016, 1, 18, 9, 0, 0)
end = datetime.datetime(2016, 1, 22, 18, 0, 0)
bdiff = businesshrs.difference(start, end)
print bdiff
# <BusinessTimeDelta 40 hours 0 seconds>
print "%s hours and %s seconds" % (bdiff.hours, bdiff.seconds)
# 40 hours and 0 seconds
Business time arithmetic
print start + businesstimedelta.BusinessTimeDelta(businesshrs, hours=40)
# 2016-01-22 18:00:00+00:00
print end - businesstimedelta.BusinessTimeDelta(businesshrs, hours=40)
# 2016-01-18 09:00:00+00:00
To define holidays, simply use the Holidays package
import holidays as pyholidays
ca_holidays = pyholidays.US(state='CA')
holidays = businesstimedelta.HolidayRule(ca_holidays)
businesshrs = businesstimedelta.Rules([workday, lunchbreak, holidays])
# Christmas is on Friday 2015/12/25
start = datetime.datetime(2015, 12, 21, 9, 0, 0)
end = datetime.datetime(2015, 12, 28, 9, 0, 0)
print businesshrs.difference(start, end)
# <BusinessTimeDelta 32 hours 0 seconds>
Timezones
If your datetimes are not timezone aware, they will be localized to UTC (see example above).
Let's say you want to calculate the business time overlap between a working day in San Francisco and in Santiago, Chile:
santiago_workday = businesstimedelta.WorkDayRule(
start_time=datetime.time(9),
end_time=datetime.time(18),
working_days=[0, 1, 2, 3, 4],
tz=pytz.timezone('America/Santiago'))
santiago_lunchbreak = businesstimedelta.LunchTimeRule(
start_time=datetime.time(12),
end_time=datetime.time(13),
working_days=[0, 1, 2, 3, 4],
tz=pytz.timezone('America/Santiago'))
santiago_businesshrs = businesstimedelta.Rules([santiago_workday, santiago_lunchbreak])
sf_tz = pytz.timezone('America/Los_Angeles')
sf_start = sf_tz.localize(datetime.datetime(2016, 1, 18, 9, 0, 0))
sf_end = sf_tz.localize(datetime.datetime(2016, 1, 18, 18, 0, 0))
print santiago_businesshrs.difference(sf_start, sf_end)
# <BusinessTimeDelta 4 hours 0 seconds>
Overnight Shifts
# Day shift
workday = WorkDayRule(
start_time=datetime.time(9),
end_time=datetime.time(17),
working_days=[0, 1, 2, 3, 4],
tz=pytz.utc)
# Night shift
nightshift = businesstimedelta.WorkDayRule(
start_time=datetime.time(23),
end_time=datetime.time(7),
working_days=[0, 1, 2, 3, 4])
businesshrs = businesstimedelta.Rules([workday, nightshift])
start = datetime.datetime(2016, 1, 18, 9, 0, 0)
end = datetime.datetime(2016, 1, 22, 18, 0, 0)
bdiff = businesshrs.difference(start, end)
print bdiff
# <BusinessTimeDelta 80 hours 0 seconds>
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for businesstimedelta-1.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c90ecfc1e11c3493fd3dfebb0b35e998f29d45ea3ad54cbec5dc2c78ebc70d5 |
|
MD5 | 24e417314dafd66f15c935d8000b1b9a |
|
BLAKE2b-256 | 93bd509890e3652e713186638b4784f6f325392ce8699ed1c16ddac5ffc20f11 |