Skip to content
7 changes: 6 additions & 1 deletion parcels/tools/converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,13 @@
self.time_origin = time_origin
self.calendar: str | None = None
if isinstance(time_origin, np.datetime64):
self.time_origin = time_origin
self.calendar = "np_datetime64"
elif isinstance(time_origin, np.timedelta64):
self.time_origin = time_origin.astype("timedelta64[ns]")

Check warning on line 63 in parcels/tools/converters.py

View check run for this annotation

Codecov / codecov/patch

parcels/tools/converters.py#L63

Added line #L63 was not covered by tests
self.calendar = "np_timedelta64"
elif isinstance(time_origin, cftime.datetime):
self.time_origin = time_origin

Check warning on line 66 in parcels/tools/converters.py

View check run for this annotation

Codecov / codecov/patch

parcels/tools/converters.py#L66

Added line #L66 was not covered by tests
self.calendar = time_origin.calendar

def reltime(self, time: TimeConverter | np.datetime64 | np.timedelta64 | cftime.datetime) -> float | npt.NDArray:
Expand All @@ -79,8 +82,10 @@

"""
time = time.time_origin if isinstance(time, TimeConverter) else time
if self.calendar in ["np_datetime64", "np_timedelta64"]:
if self.calendar in ["np_datetime64"]:
return (time - self.time_origin) / np.timedelta64(1, "s") # type: ignore
elif self.calendar in ["np_timedelta64"]:
return (time - self.time_origin) / np.timedelta64(1, "ns") # type: ignore
elif self.calendar in _get_cftime_calendars():
if isinstance(time, (list, np.ndarray)):
try:
Expand Down
12 changes: 12 additions & 0 deletions tests/tools/test_converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ def test_TimeConverter_reltime_one_day():
assert tc.reltime(time) == ONE_DAY


def test_TimeConverter_timedelta64_float():
ONE_DAY = 24 * 60 * 60
tc = TimeConverter(np.timedelta64(0, "s"))
assert tc.reltime(1 * ONE_DAY) == 1 * ONE_DAY

tc = TimeConverter(np.timedelta64(0, "D"))
assert tc.reltime(1 * ONE_DAY) == 1 * ONE_DAY

tc = TimeConverter(np.timedelta64(0, "ns"))
assert tc.reltime(1 * ONE_DAY) == 1 * ONE_DAY


@pytest.mark.parametrize(
"x, y",
[
Expand Down
Loading