Skip to content

Commit 031cac5

Browse files
committed
separate CFMaskCoder test for multiple missing_values/__FillValues conflict, use _FillValue for missing_value if available
1 parent 8c074f0 commit 031cac5

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

xarray/coding/variables.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,8 @@ def encode(self, variable: Variable, name: T_Name = None):
243243
data = duck_array_ops.fillna(data, fill_value)
244244

245245
if mv is not None:
246-
# Only use mv if _FillValue isn't available
246+
# Use _FillValue if available to align missing_value to prevent issues
247+
# when decoding
247248
# Ensure missing_value is cast to same dtype as data's
248249
encoding["missing_value"] = attrs.get("_FillValue", dtype.type(mv))
249250
fill_value = pop_to(encoding, attrs, "missing_value", name=name)

xarray/tests/test_coding.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,15 @@ def test_CFMaskCoder_encode_missing_fill_values_conflict(data, encoding) -> None
5151
assert encoded.dtype == encoded.attrs["missing_value"].dtype
5252
assert encoded.dtype == encoded.attrs["_FillValue"].dtype
5353

54+
55+
def test_CFMaskCoder_multiple_missing_values_conflict():
56+
data = np.array([0.0, -1.0, 1.0])
57+
attrs = dict(_FillValue=np.float64(1e20), missing_value=np.float64(1e21))
58+
original = xr.Variable(("x",), data, attrs=attrs)
5459
with pytest.warns(variables.SerializationWarning):
55-
roundtripped = decode_cf_variable("foo", encoded)
56-
assert_identical(roundtripped, original)
60+
decoded = decode_cf_variable("foo", original)
61+
with pytest.raises(ValueError):
62+
encode_cf_variable(decoded)
5763

5864

5965
def test_CFMaskCoder_missing_value() -> None:

0 commit comments

Comments
 (0)