Source code for klotho.chronos.utils.time_conversion

from typing import Union
import numpy as np
from fractions import Fraction
from itertools import accumulate
from klotho.utils.data_structures.enums import MinMaxEnum

__all__ = [
    'seconds_to_hmsms',
    'hmsms_to_seconds',
    'seconds_to_hmsf',
    'hmsf_to_seconds',
]

[docs] def seconds_to_hmsms(seconds: float, as_string=True) -> Union[str, tuple[int, int, int, int]]: """ Convert a duration from seconds to hours, minutes, seconds, and milliseconds. Parameters ---------- seconds : float The duration in seconds. as_string : bool, optional Whether to return the result as a formatted string or a tuple. Default is True. Returns ------- str or tuple of int If ``as_string`` is True, a formatted string like ``'1h:01m:01s:500ms'`` showing non-zero units. If False, a tuple of ``(hours, minutes, seconds, milliseconds)``. Examples -------- >>> seconds_to_hmsms(3661.5) '1h:01m:01s:500ms' >>> seconds_to_hmsms(3661.5, as_string=False) (1, 1, 1, 500) """ h = int(seconds // 3600) seconds %= 3600 m = int(seconds // 60) seconds %= 60 s = int(seconds) ms = int((seconds - s) * 1000) if not as_string: return (h, m, s, ms) parts = [] if h > 0: parts.append(f'{h}h') if h > 0 or m > 0: parts.append(f'{m:02}m') parts.append(f'{s:02}s') parts.append(f'{ms:03}ms') return ':'.join(parts)
[docs] def hmsms_to_seconds(h:int = 0, m:int = 0, s:int = 0, ms:int = 0) -> float: """ Convert hours, minutes, seconds, and milliseconds to total seconds. Parameters ---------- h : int, optional Hours. Default is 0. m : int, optional Minutes. Default is 0. s : int, optional Seconds. Default is 0. ms : int, optional Milliseconds. Default is 0. Returns ------- float Total duration in seconds. Examples -------- >>> hmsms_to_seconds(h=1, m=30, s=45, ms=500) 5445.5 """ return h * 3600 + m * 60 + s + ms / 1000
[docs] def seconds_to_hmsf(seconds: float, fps: int = 30, as_string: bool = True) -> Union[str, tuple[int, int, int, int]]: """ Convert a duration from seconds to hours, minutes, seconds, and frames. Parameters ---------- seconds : float The duration in seconds. fps : int, optional Frames per second. Default is 30. as_string : bool, optional Whether to return the result as a formatted string or a tuple. Default is True. Returns ------- str or tuple of int If ``as_string`` is True, a formatted string like ``'1h:01m:01s:15f'``. If False, a tuple of ``(hours, minutes, seconds, frames)``. Examples -------- >>> seconds_to_hmsf(3661.5, fps=30) '1h:01m:01s:15f' >>> seconds_to_hmsf(3661.5, fps=30, as_string=False) (1, 1, 1, 15) """ h = int(seconds // 3600) seconds %= 3600 m = int(seconds // 60) seconds %= 60 s = int(seconds) f = int((seconds - s) * fps) if not as_string: return (h, m, s, f) parts = [] if h > 0: parts.append(f'{h}h') if h > 0 or m > 0: parts.append(f'{m:02}m') parts.append(f'{s:02}s') parts.append(f'{f:02}f') return ':'.join(parts)
[docs] def hmsf_to_seconds(h:int = 0, m:int = 0, s:int = 0, f:int = 0, fps: int = 30) -> float: """ Convert hours, minutes, seconds, and frames to total seconds. Parameters ---------- h : int, optional Hours. Default is 0. m : int, optional Minutes. Default is 0. s : int, optional Seconds. Default is 0. f : int, optional Frames. Default is 0. fps : int, optional Frames per second. Default is 30. Returns ------- float Total duration in seconds. Examples -------- >>> hmsf_to_seconds(h=1, m=30, s=45, f=15, fps=30) 5445.5 """ return h * 3600 + m * 60 + s + f / fps