Skip to content
Snippets Groups Projects
datetime.py 1.29 KiB
Newer Older
from typing import Literal, List
import numpy as np

# As the logic changed from revision to revision, these are solely transparent wrappers for numpy's datetime and
# timedelta conversions. These are most likely unnecessary and can be removed at a later date
def as_datetime(
        date: str | np.datetime64
        ) -> np.datetime64:
    return np.datetime64(date,'ns') if isinstance(date,str) else date

def as_timedelta(
        val: int,
        unit: Literal['D','W']
        ) -> np.timedelta64:
    return np.timedelta64(val, unit)

def create_timedelta_breakpoints(
    run_date: str | np.datetime64,
    delta_vals: int | List[int],
    delta_unit: Literal['D','W']
) -> List[np.datetime64]:
    run_date = as_datetime(run_date)
    return [run_date - as_timedelta(c,delta_unit) for c in delta_vals if c > 0]

def create_timedelta_labels(
    delta_vals: int | List[int],
    delta_unit: Literal['D','W'],
) -> List[str]:
    if not isinstance(delta_vals,list):
        delta_vals=[delta_vals]
    delta_vals.sort(reverse=True)
    deltas = [f'{d}{delta_unit}' for d in delta_vals]

    if len(delta_vals) > 1:
        labels = [f'>{deltas[0]}'] + [f'{deltas[i+1]}-{deltas[i]}' for i in range(len(deltas)-1)] + [f'<{deltas[-1]}']
    else:
        labels = [f'>{deltas[0]}'] + [f'<{deltas[0]}']
    return labels