-
-
Couldn't load subscription status.
- Fork 1.2k
Support .sel with method kwarg for slices
#10711
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
63c1b6a
c03b0e9
e65b759
20a6d3b
ee1da65
308d8c9
61c1412
d7ec746
8842b23
1fe2961
bb36ae7
4dd2d63
ae391b3
f10a3a2
74f3d07
d05ab1a
199765e
8cce331
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2164,8 +2164,13 @@ def test_sel_method(self) -> None: | |
| actual = data.sel(dim2=[1.45], method="backfill") | ||
| assert_identical(expected, actual) | ||
|
|
||
| with pytest.raises(NotImplementedError, match=r"slice objects"): | ||
| data.sel(dim2=slice(1, 3), method="ffill") | ||
| expected = data.isel(dim2=slice(2, 7)) | ||
| actual = data.sel(dim2=slice(1, 3), method="ffill") | ||
| assert_identical(expected, actual) | ||
|
|
||
| expected = data.isel(dim2=slice(2, 7, 2)) | ||
| actual = data.sel(dim2=slice(1, 3, 2), method="ffill") | ||
| assert_identical(expected, actual) | ||
|
Comment on lines
+2167
to
+2173
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. add a test for |
||
|
|
||
| with pytest.raises(TypeError, match=r"``method``"): | ||
| # this should not pass silently | ||
|
|
@@ -2175,6 +2180,110 @@ def test_sel_method(self) -> None: | |
| with pytest.raises(ValueError, match=r"cannot supply"): | ||
| data.sel(dim1=0, method="nearest") | ||
|
|
||
| def test_sel_method_with_slice(self) -> None: | ||
| # regression test for https://github.com/pydata/xarray/issues/10710 | ||
|
|
||
| data_int_coords = xr.Dataset(coords={"lat": ("lat", [20, 21, 22, 23])}) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [21, 22])}) | ||
| actual = data_int_coords.sel(lat=slice(21, 22), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| # check non-zero step | ||
| expected = xr.Dataset(coords={"lat": ("lat", [21])}) | ||
| actual = data_int_coords.sel(lat=slice(21, 22, 2), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| # check consistency with not passing method kwarg, for case of ints, where method kwarg should be irrelevant | ||
| expected = data_int_coords.sel(lat=slice(21, 22)) | ||
| actual = data_int_coords.sel(lat=slice(21, 22), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| data_float_coords = xr.Dataset( | ||
| coords={"lat": ("lat", [20.1, 21.1, 22.1, 23.1])} | ||
| ) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [21.1, 22.1])}) | ||
| actual = data_float_coords.sel(lat=slice(21, 22), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| # "no match" case - should return zero-size slice | ||
| expected = xr.Dataset(coords={"lat": ("lat", [])}) | ||
| actual = data_float_coords.sel( | ||
| lat=slice(21.5, 21.6), method="nearest", tolerance=1e-3 | ||
| ) | ||
| assert_identical(expected, actual) | ||
|
|
||
| # test supposed default behaviour | ||
| expected = xr.Dataset(coords={"lat": ("lat", [21.1, 22.1])}) | ||
| actual = data_float_coords.sel(lat=slice(21.0, 22.2)) | ||
| assert_identical(expected, actual) | ||
|
|
||
| # tolerance specified but method not specified | ||
| expected = xr.Dataset(coords={"lat": ("lat", [21.1, 22.1])}) | ||
| actual = data_float_coords.sel( | ||
| lat=slice(21.0, 22.2), | ||
| tolerance=1.0, | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. tolerance=0.0 might be a cleaner test here |
||
| ) | ||
| assert_identical(expected, actual) | ||
| # test this matches default behaviour without tolerance specified | ||
| default = data_float_coords.sel(lat=slice(21.0, 22.2)) | ||
| assert_identical(default, actual) | ||
|
|
||
| # "no match" case - should return zero-size slice | ||
| expected = xr.Dataset(coords={"lat": ("lat", [])}) | ||
| actual = data_float_coords.sel( | ||
| lat=slice(21.5, 21.6), method="nearest", tolerance=1e-3 | ||
| ) | ||
| assert_identical(expected, actual) | ||
|
|
||
| # non-unique coordinate values | ||
| data_non_unique = xr.Dataset( | ||
| coords={"lat": ("lat", [20.1, 21.1, 21.1, 22.1, 22.1, 23.1])} | ||
| ) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [21.1, 21.1, 22.1, 22.1])}) | ||
| with pytest.raises( | ||
| NotImplementedError, | ||
| match="slice object as an indexer and an index with non-unique values", | ||
| ): | ||
| data_non_unique.sel(lat=slice(21.0, 22.2), method="nearest") | ||
|
|
||
| # check non-zero step | ||
| data_float_coords = xr.Dataset( | ||
| coords={"lat": ("lat", [20.1, 21.1, 22.1, 23.1])} | ||
| ) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [21.1])}) | ||
| actual = data_float_coords.sel(lat=slice(21, 22, 2), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| # backwards slices | ||
| data_int_coords = xr.Dataset(coords={"lat": ("lat", [23, 22, 21, 20])}) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [22, 21])}) | ||
| actual = data_int_coords.sel(lat=slice(22, 21), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| data_float_coords = xr.Dataset( | ||
| coords={"lat": ("lat", [23.1, 22.1, 21.1, 20.1])} | ||
| ) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [22.1, 21.1])}) | ||
| actual = data_float_coords.sel(lat=slice(22, 21), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| def test_sel_negative_slices(self) -> None: | ||
| data_int_coords = xr.Dataset(coords={"lat": ("lat", [-23, -22, -21, -20])}) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [-22, -21])}) | ||
| actual = data_int_coords.sel(lat=slice(-22, -21)) | ||
| assert_identical(expected, actual) | ||
|
|
||
| expected = xr.Dataset(coords={"lat": ("lat", [-22, -21])}) | ||
| actual = data_int_coords.sel(lat=slice(-22, -21), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| data_float_coords = xr.Dataset( | ||
| coords={"lat": ("lat", [-23.1, -22.1, -21.1, -20.1])} | ||
| ) | ||
| expected = xr.Dataset(coords={"lat": ("lat", [-22.1, -21.1])}) | ||
| actual = data_float_coords.sel(lat=slice(-22, -21), method="nearest") | ||
| assert_identical(expected, actual) | ||
|
|
||
| def test_loc(self) -> None: | ||
| data = create_test_data() | ||
| expected = data.sel(dim3="a") | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the default is inclusive?