Add and subtract HH:MM[:SS] time strings in Python — durations, aggregation, and timedelta integration.
Project description
hmscalc
Add and subtract HH:MM / HH:MM:SS time strings in Python — no manual conversion to seconds required.
Quick Start
pip install hmscalc
from hmscalc import HMSTime
a = HMSTime("1:30:15")
b = HMSTime("2:15:45")
print(a + b) # "3:46:00"
print(a - b) # "-0:45:30"
print(a * 2) # "3:00:30"
print(a / 2) # "0:45:07"
Why hmscalc?
| Approach | Limitation |
|---|---|
datetime.timedelta |
No "1:30:15" string parsing out of the box |
| Manual seconds math | Verbose; easy to mishandle negative values |
pytimeparse |
Parse-only — arithmetic is still on you |
| hmscalc | Parse and add / subtract / aggregate in one API |
Features
- Addition, subtraction, and scalar multiply/divide
- Sum, average, min, and max of multiple values
HH:MMandHH:MM:SSinput (hours may exceed 24 — duration model)- Negative durations, comparison operators,
datetime.timedeltaintegration - Input whitespace trimming (
" 1:30:15 ") - Type hints with
py.typedmarker - Python 3.9 through 3.14
Usage
Import
from hmscalc import HMSTime
Basic Operations
a = HMSTime("1:30:15")
b = HMSTime("2:15:45")
print(a + b) # "3:46:00"
print(a - b) # "-0:45:30"
print(a > b) # False
print(a.to_seconds()) # 5415
print(a.to_tuple()) # (1, 30, 15)
print(a.to_dict()) # {'hh': 1, 'mm': 30, 'ss': 15, 'negative': False}
Scalar Operations
HMSTime("1:00:00") * 3 # "3:00:00"
HMSTime("1:30:00") / 2 # "0:45:00"
2 * HMSTime("0:30:00") # "1:00:00"
Aggregation
times = [HMSTime("1:30:15"), HMSTime("2:15:45"), HMSTime("0:45:30")]
HMSTime.sum(times) # "4:31:30"
HMSTime.average(times) # "1:30:30"
HMSTime.min(times) # "0:45:30"
HMSTime.max(times) # "2:15:45"
Work Time Example
work_sessions = [
HMSTime("2:15:30"),
HMSTime("1:45:00"),
HMSTime("0:30:15"),
]
print(HMSTime.sum(work_sessions)) # "4:30:45"
timedelta Integration
import datetime
t = HMSTime("1:30:15")
delta = t.to_timedelta()
restored = HMSTime.from_timedelta(delta) # HMSTime("1:30:15")
Error Handling
from hmscalc import InvalidTimeFormatError, NotTimeStringError
HMSTime(" 1:30:15 ") # OK — whitespace trimmed
HMSTime("1:99:00") # InvalidTimeFormatError
HMSTime(123) # NotTimeStringError
Input Rules
- Formats:
HH:MMorHH:MM:SS - Minutes and seconds: 0–59
- Optional leading
-for negative durations - Surrounding whitespace is ignored
Development
Requires Docker (optional) or Poetry locally.
# Local (Poetry)
poetry install
poetry run pytest
# Docker matrix (Python 3.9–3.14)
docker build -t hmscalc .
docker run --rm hmscalc ./runtests.sh
docker run --rm hmscalc ./lint.sh
Links
License
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
hmscalc-0.4.0.tar.gz
(5.9 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hmscalc-0.4.0.tar.gz.
File metadata
- Download URL: hmscalc-0.4.0.tar.gz
- Upload date:
- Size: 5.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.4.1 CPython/3.11.15 Linux/6.17.0-1015-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96fa1ab7f35d0ca1b13b4ab17b2763546427a6303779d426d19a71f60e2eeea0
|
|
| MD5 |
e9d92455cc875db66a0fc2ceaa524acb
|
|
| BLAKE2b-256 |
ed8f5cb14e69b8721557b9fe637f2c757b5c1a8f50542accc231c6c3e14e3846
|
File details
Details for the file hmscalc-0.4.0-py3-none-any.whl.
File metadata
- Download URL: hmscalc-0.4.0-py3-none-any.whl
- Upload date:
- Size: 6.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.4.1 CPython/3.11.15 Linux/6.17.0-1015-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9094cad73ade7494748b05c50a140202f1f3a2a708691f0daaf977abece95343
|
|
| MD5 |
036a2872668a12f7913505876df3d9cb
|
|
| BLAKE2b-256 |
8a168165f1e19642f7f6a6268d347100ef82f7fb07191842e9747efa35ee92b0
|