|
12 | 12 |
|
13 | 13 | import xarray as xr
|
14 | 14 | from xarray import DataArray, Dataset, Variable
|
15 |
| -from xarray.core.groupby import ( |
16 |
| - BinGrouper, |
17 |
| - UniqueGrouper, |
18 |
| - _consolidate_slices, |
19 |
| -) |
| 15 | +from xarray.core.groupby import _consolidate_slices |
| 16 | +from xarray.core.groupers import BinGrouper, EncodedGroups, Grouper, UniqueGrouper |
20 | 17 | from xarray.core.types import InterpOptions
|
21 | 18 | from xarray.tests import (
|
22 | 19 | InaccessibleArray,
|
@@ -2627,3 +2624,26 @@ def test_default_flox_method() -> None:
|
2627 | 2624 | assert kwargs["method"] == "cohorts"
|
2628 | 2625 | else:
|
2629 | 2626 | assert "method" not in kwargs
|
| 2627 | + |
| 2628 | + |
| 2629 | +def test_custom_grouper() -> None: |
| 2630 | + class YearGrouper(Grouper): |
| 2631 | + """ |
| 2632 | + An example re-implementation of ``.groupby("time.year")``. |
| 2633 | + """ |
| 2634 | + |
| 2635 | + def factorize(self, group) -> EncodedGroups: |
| 2636 | + assert np.issubdtype(group.dtype, np.datetime64) |
| 2637 | + year = group.dt.year.data |
| 2638 | + codes_, uniques = pd.factorize(year) |
| 2639 | + codes = group.copy(data=codes_).rename("year") |
| 2640 | + return EncodedGroups(codes=codes, full_index=pd.Index(uniques)) |
| 2641 | + |
| 2642 | + ds = xr.DataArray( |
| 2643 | + dims="time", |
| 2644 | + data=np.arange(20), |
| 2645 | + coords={"time": ("time", pd.date_range("2000-01-01", freq="3ME", periods=20))}, |
| 2646 | + ) |
| 2647 | + actual = ds.groupby(time=YearGrouper()).mean() |
| 2648 | + expected = ds.groupby("time.year").mean() |
| 2649 | + assert_identical(expected, actual) |
0 commit comments