diff --git a/src/zarr/core/dtype/npy/time.py b/src/zarr/core/dtype/npy/time.py index 1a46f77983..c4495e167c 100644 --- a/src/zarr/core/dtype/npy/time.py +++ b/src/zarr/core/dtype/npy/time.py @@ -545,6 +545,8 @@ def cast_scalar(self, data: object) -> np.timedelta64: raise a TypeError. """ if self._check_scalar(data): + if isinstance(data, np.timedelta64) and np.isnat(data): + return np.timedelta64("NaT", self.unit) return self._cast_scalar_unchecked(data) msg = ( f"Cannot convert object {data!r} with type {type(data)} to a scalar compatible with the " @@ -559,7 +561,7 @@ def default_scalar(self) -> np.timedelta64: This method provides a default value for the timedelta64 scalar, which is a 'Not-a-Time' (NaT) value. """ - return np.timedelta64("NaT") + return np.timedelta64("NaT", self.unit) def from_json_scalar(self, data: JSON, *, zarr_format: ZarrFormat) -> np.timedelta64: """ diff --git a/tests/test_dtype/test_npy/test_time.py b/tests/test_dtype/test_npy/test_time.py index b94b600cbf..1b1f428e40 100644 --- a/tests/test_dtype/test_npy/test_time.py +++ b/tests/test_dtype/test_npy/test_time.py @@ -115,7 +115,7 @@ class TestTimeDelta64(_TestTimeBase): cast_value_params = ( (TimeDelta64(unit="ns", scale_factor=1), "1", np.timedelta64(1, "ns")), - (TimeDelta64(unit="ns", scale_factor=1), "NaT", np.timedelta64("NaT")), + (TimeDelta64(unit="ns", scale_factor=1), "NaT", np.timedelta64("NaT", "ns")), ) invalid_scalar_params = ( (TimeDelta64(unit="Y", scale_factor=1), 1.3), @@ -148,6 +148,12 @@ def test_time_scale_factor_too_low() -> None: TimeDelta64(scale_factor=scale_factor) +def test_default_is_NaT() -> None: + np.testing.assert_equal( + TimeDelta64(unit="ns", scale_factor=1).default_scalar(), np.timedelta64("NaT", "ns") + ) + + def test_time_scale_factor_too_high() -> None: """ Test that an invalid unit raises a ValueError.