Source code for perda.utils.time_alignment
from __future__ import annotations
import numpy as np
from numpy.typing import NDArray
from ..core_data_structures.data_instance import DataInstance
from ..units import Timescale, to_seconds
[docs]
def apply_time_offset(
di: DataInstance | list[DataInstance],
offset_s: float,
source_time_unit: Timescale = Timescale.MS,
) -> DataInstance | list[DataInstance]:
"""Shift signals in time by a fixed offset, but keeping the same timestamp list.
Shifts the values, not the timestamps. Create a new time series with the same values offset_s away,
then re-interpolate the original timestamps onto this series.
Parameters
----------
di : DataInstance | list[DataInstance]
Input signal(s). Lists are processed independently.
offset_s : float
Time shift in seconds (positive shifts the signal later).
source_time_unit : Timescale, optional
Timestamp unit of ``di.timestamp_np``. Default is ``Timescale.MS``.
Returns
-------
DataInstance | list[DataInstance]
New DataInstance(s) with time-shifted ``value_np`` on the original timestamp grid.
Examples
--------
>>> di_aligned = apply_time_offset(gps_speed_di, offset_s=-0.08)
>>> a, b = apply_time_offset([di_a, di_b], offset_s=0.05)
"""
di_list = [di] if isinstance(di, DataInstance) else di
results: list[DataInstance] = []
for instance in di_list:
if offset_s == 0.0:
results.append(instance)
continue
t_s: NDArray = to_seconds(
instance.timestamp_np.astype(np.float64), source_time_unit
)
signal = instance.value_np.astype(np.float64)
valid = ~np.isnan(signal)
if valid.sum() < 2:
print("Too few valid points to interpolate, skipping time offset")
results.append(instance)
continue
src_t: NDArray = t_s[valid] + offset_s
src_v: NDArray = signal[valid]
shifted = np.interp(t_s, src_t, src_v, left=src_v[0], right=src_v[-1])
results.append(
DataInstance(
timestamp_np=instance.timestamp_np,
value_np=shifted,
label=instance.label or f"var_id={instance.var_id}",
var_id=instance.var_id,
cpp_name=instance.cpp_name,
)
)
return results[0] if len(results) == 1 else results