From 28bbf962a252598ee790784a3ab78477b8a57a3f Mon Sep 17 00:00:00 2001 From: David Huard Date: Mon, 11 Mar 2024 18:45:24 -0400 Subject: [PATCH 1/5] Add small test exposing issue from #7794. Propose fix for _wrap_numpy_scalars --- xarray/core/indexing.py | 4 ++++ xarray/tests/test_backends.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/xarray/core/indexing.py b/xarray/core/indexing.py index 62889e03861..d30e1fcf33a 100644 --- a/xarray/core/indexing.py +++ b/xarray/core/indexing.py @@ -686,6 +686,10 @@ def _wrap_numpy_scalars(array): """Wrap NumPy scalars in 0d arrays.""" if np.isscalar(array): return np.array(array) + elif hasattr(array, "dtype"): + return array + elif np.ndim(array) == 0: + return np.array(array) else: return array diff --git a/xarray/tests/test_backends.py b/xarray/tests/test_backends.py index 668d14b86c9..de26324c655 100644 --- a/xarray/tests/test_backends.py +++ b/xarray/tests/test_backends.py @@ -2060,6 +2060,25 @@ def test_write_inconsistent_chunks(self) -> None: assert actual["x"].encoding["chunksizes"] == (50, 100) assert actual["y"].encoding["chunksizes"] == (100, 50) + @requires_cftime + def test_roundtrip_cftime_bnds(self): + # Regression test for issue #7794 + import cftime + original = xr.Dataset( + {"foo": ("time", [0.]), + "time_bnds": (("time","bnds"), [[cftime.Datetime360Day(2005, 12, 1, 0, 0, 0, 0), + cftime.Datetime360Day(2005, 12, 2, 0, 0, 0, 0)]])}, + {"time": [cftime.Datetime360Day(2005, 12, 1, 12, 0, 0, 0)]}) + + + with create_tmp_file() as tmp_file: + original.to_netcdf(tmp_file) + with open_dataset(tmp_file) as actual: + tb = actual.time_bnds.values + chunked = actual.chunk(time=1) + with create_tmp_file() as tmp_file_chunked: + chunked.to_netcdf(tmp_file_chunked) + @requires_zarr class ZarrBase(CFEncodedBase): From 1c3ce2a65339b23e66acbb7e69af9b587a35adb2 Mon Sep 17 00:00:00 2001 From: David Huard Date: Tue, 12 Mar 2024 09:32:27 -0400 Subject: [PATCH 2/5] black --- xarray/tests/test_backends.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/xarray/tests/test_backends.py b/xarray/tests/test_backends.py index de26324c655..810463afd97 100644 --- a/xarray/tests/test_backends.py +++ b/xarray/tests/test_backends.py @@ -2064,17 +2064,28 @@ def test_write_inconsistent_chunks(self) -> None: def test_roundtrip_cftime_bnds(self): # Regression test for issue #7794 import cftime - original = xr.Dataset( - {"foo": ("time", [0.]), - "time_bnds": (("time","bnds"), [[cftime.Datetime360Day(2005, 12, 1, 0, 0, 0, 0), - cftime.Datetime360Day(2005, 12, 2, 0, 0, 0, 0)]])}, - {"time": [cftime.Datetime360Day(2005, 12, 1, 12, 0, 0, 0)]}) + original = xr.Dataset( + { + "foo": ("time", [0.0]), + "time_bnds": ( + ("time", "bnds"), + [ + [ + cftime.Datetime360Day(2005, 12, 1, 0, 0, 0, 0), + cftime.Datetime360Day(2005, 12, 2, 0, 0, 0, 0), + ] + ], + ), + }, + {"time": [cftime.Datetime360Day(2005, 12, 1, 12, 0, 0, 0)]}, + ) with create_tmp_file() as tmp_file: original.to_netcdf(tmp_file) with open_dataset(tmp_file) as actual: - tb = actual.time_bnds.values + # Needed to load time_bnds into memory + assert actual.time_bnds.values == original.time_bnds chunked = actual.chunk(time=1) with create_tmp_file() as tmp_file_chunked: chunked.to_netcdf(tmp_file_chunked) From 12217501029657ba8b6e90a4243bbe45dd73a228 Mon Sep 17 00:00:00 2001 From: David Huard Date: Tue, 12 Mar 2024 16:15:54 -0400 Subject: [PATCH 3/5] fix --- xarray/tests/test_backends.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xarray/tests/test_backends.py b/xarray/tests/test_backends.py index 810463afd97..f7f11ecf281 100644 --- a/xarray/tests/test_backends.py +++ b/xarray/tests/test_backends.py @@ -2084,8 +2084,8 @@ def test_roundtrip_cftime_bnds(self): with create_tmp_file() as tmp_file: original.to_netcdf(tmp_file) with open_dataset(tmp_file) as actual: - # Needed to load time_bnds into memory - assert actual.time_bnds.values == original.time_bnds + # Operation to load actual time_bnds into memory + assert_array_equal(actual.time_bnds.values, original.time_bnds.values) chunked = actual.chunk(time=1) with create_tmp_file() as tmp_file_chunked: chunked.to_netcdf(tmp_file_chunked) From 6e0e9e951d04f0086d4cddc48faac37cceb916ff Mon Sep 17 00:00:00 2001 From: Pascal Bourgault Date: Mon, 3 Mar 2025 11:31:14 -0500 Subject: [PATCH 4/5] Update xarray/core/indexing.py Co-authored-by: Justus Magin --- xarray/core/indexing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xarray/core/indexing.py b/xarray/core/indexing.py index 2340983ccfa..995ed988768 100644 --- a/xarray/core/indexing.py +++ b/xarray/core/indexing.py @@ -768,7 +768,7 @@ def __repr__(self) -> str: def _wrap_numpy_scalars(array): """Wrap NumPy scalars in 0d arrays.""" - if np.isscalar(array): + if np.ndim(array) == 0 and (isinstance(array, np.generic) or not (is_duck_array(array) or isinstance(array, NDArrayMixin))): return np.array(array) elif hasattr(array, "dtype"): return array From 6c4bdf257046f7c209ea6079c40e99644aba6a91 Mon Sep 17 00:00:00 2001 From: Pascal Bourgault Date: Mon, 3 Mar 2025 11:53:05 -0500 Subject: [PATCH 5/5] run precommit --- xarray/core/indexing.py | 5 ++++- xarray/tests/test_backends.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/xarray/core/indexing.py b/xarray/core/indexing.py index 995ed988768..1df1394a1d0 100644 --- a/xarray/core/indexing.py +++ b/xarray/core/indexing.py @@ -768,7 +768,10 @@ def __repr__(self) -> str: def _wrap_numpy_scalars(array): """Wrap NumPy scalars in 0d arrays.""" - if np.ndim(array) == 0 and (isinstance(array, np.generic) or not (is_duck_array(array) or isinstance(array, NDArrayMixin))): + if np.ndim(array) == 0 and ( + isinstance(array, np.generic) + or not (is_duck_array(array) or isinstance(array, NDArrayMixin)) + ): return np.array(array) elif hasattr(array, "dtype"): return array diff --git a/xarray/tests/test_backends.py b/xarray/tests/test_backends.py index e3c13db5663..c9f89a65df9 100644 --- a/xarray/tests/test_backends.py +++ b/xarray/tests/test_backends.py @@ -2275,7 +2275,7 @@ def test_write_inconsistent_chunks(self) -> None: @pytest.mark.flaky def test_roundtrip_coordinates(self) -> None: super().test_roundtrip_coordinates() - + @requires_cftime def test_roundtrip_cftime_bnds(self): # Regression test for issue #7794 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy