diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index d03b806f884..e1cddb02008 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -4987,7 +4987,10 @@ def reduce( variables[name] = var else: if ( - not numeric_only + # Some reduction functions (e.g. std, var) need to run on variables + # that don't have the reduce dims: PR5393 + not reduce_dims + or not numeric_only or np.issubdtype(var.dtype, np.number) or (var.dtype == np.bool_) ): diff --git a/xarray/tests/test_dataset.py b/xarray/tests/test_dataset.py index 7cade41070f..585ff8e2f3e 100644 --- a/xarray/tests/test_dataset.py +++ b/xarray/tests/test_dataset.py @@ -4947,15 +4947,16 @@ def test_reduce_cumsum_test_dims(self, reduct, expected, func): def test_reduce_non_numeric(self): data1 = create_test_data(seed=44) data2 = create_test_data(seed=44) - add_vars = {"var4": ["dim1", "dim2"]} + add_vars = {"var4": ["dim1", "dim2"], "var5": ["dim1"]} for v, dims in sorted(add_vars.items()): size = tuple(data1.dims[d] for d in dims) data = np.random.randint(0, 100, size=size).astype(np.str_) data1[v] = (dims, data, {"foo": "variable"}) - assert "var4" not in data1.mean() + assert "var4" not in data1.mean() and "var5" not in data1.mean() assert_equal(data1.mean(), data2.mean()) assert_equal(data1.mean(dim="dim1"), data2.mean(dim="dim1")) + assert "var4" not in data1.mean(dim="dim2") and "var5" in data1.mean(dim="dim2") @pytest.mark.filterwarnings( "ignore:Once the behaviour of DataArray:DeprecationWarning"