diff --git a/xarray/core/common.py b/xarray/core/common.py index af115a8ef09..f9c203d3249 100644 --- a/xarray/core/common.py +++ b/xarray/core/common.py @@ -28,6 +28,9 @@ except ImportError: cftime = None +if TYPE_CHECKING: + from xarray.core.types import ResampleCompatible + # Used as a sentinel value to indicate a all dimensions ALL_DIMS = ... @@ -890,7 +893,7 @@ def rolling_exp( def _resample( self, resample_cls: type[T_Resample], - indexer: Mapping[Hashable, str | Resampler] | None, + indexer: Mapping[Hashable, ResampleCompatible | Resampler] | None, skipna: bool | None, closed: SideOptions | None, label: SideOptions | None, @@ -1077,7 +1080,7 @@ def _resample( ) grouper: Resampler - if isinstance(freq, str | datetime.timedelta | pd.Timedelta | pd.DateOffset): + if isinstance(freq, ResampleCompatible): grouper = TimeResampler( freq=freq, closed=closed, label=label, origin=origin, offset=offset ) diff --git a/xarray/core/dataarray.py b/xarray/core/dataarray.py index 4a48cb2b3e9..643e50c6307 100644 --- a/xarray/core/dataarray.py +++ b/xarray/core/dataarray.py @@ -110,6 +110,7 @@ QueryEngineOptions, QueryParserOptions, ReindexMethodOptions, + ResampleCompatible, Self, SideOptions, T_ChunkDimFreq, @@ -7244,7 +7245,7 @@ def coarsen( @_deprecate_positional_args("v2024.07.0") def resample( self, - indexer: Mapping[Hashable, str | Resampler] | None = None, + indexer: Mapping[Hashable, ResampleCompatible | Resampler] | None = None, *, skipna: bool | None = None, closed: SideOptions | None = None, @@ -7252,11 +7253,7 @@ def resample( offset: pd.Timedelta | datetime.timedelta | str | None = None, origin: str | DatetimeLike = "start_day", restore_coord_dims: bool | None = None, - **indexer_kwargs: str - | datetime.timedelta - | pd.Timedelta - | pd.DateOffset - | Resampler, + **indexer_kwargs: ResampleCompatible | Resampler, ) -> DataArrayResample: """Returns a Resample object for performing resampling operations. @@ -7267,7 +7264,7 @@ def resample( Parameters ---------- - indexer : Mapping of Hashable to str, optional + indexer : Mapping of Hashable to str, datetime.timedelta, pd.Timedelta, pd.DateOffset, or Resampler, optional Mapping from the dimension name to resample frequency [1]_. The dimension must be datetime-like. skipna : bool, optional @@ -7291,7 +7288,7 @@ def resample( restore_coord_dims : bool, optional If True, also restore the dimension order of multi-dimensional coordinates. - **indexer_kwargs : str + **indexer_kwargs : str, datetime.timedelta, pd.Timedelta, pd.DateOffset, or Resampler The keyword arguments form of ``indexer``. One of indexer or indexer_kwargs must be provided. diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index 63c53ed5768..a5e6f97ddfc 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -162,6 +162,7 @@ QueryEngineOptions, QueryParserOptions, ReindexMethodOptions, + ResampleCompatible, SideOptions, T_ChunkDimFreq, T_DatasetPadConstantValues, @@ -10685,7 +10686,7 @@ def coarsen( @_deprecate_positional_args("v2024.07.0") def resample( self, - indexer: Mapping[Any, str | Resampler] | None = None, + indexer: Mapping[Any, ResampleCompatible | Resampler] | None = None, *, skipna: bool | None = None, closed: SideOptions | None = None, @@ -10693,11 +10694,7 @@ def resample( offset: pd.Timedelta | datetime.timedelta | str | None = None, origin: str | DatetimeLike = "start_day", restore_coord_dims: bool | None = None, - **indexer_kwargs: str - | datetime.timedelta - | pd.Timedelta - | pd.DateOffset - | Resampler, + **indexer_kwargs: ResampleCompatible | Resampler, ) -> DatasetResample: """Returns a Resample object for performing resampling operations. @@ -10708,7 +10705,7 @@ def resample( Parameters ---------- - indexer : Mapping of Hashable to str, optional + indexer : Mapping of Hashable to str, datetime.timedelta, pd.Timedelta, pd.DateOffset, or Resampler, optional Mapping from the dimension name to resample frequency [1]_. The dimension must be datetime-like. skipna : bool, optional @@ -10732,7 +10729,7 @@ def resample( restore_coord_dims : bool, optional If True, also restore the dimension order of multi-dimensional coordinates. - **indexer_kwargs : str + **indexer_kwargs : str, datetime.timedelta, pd.Timedelta, pd.DateOffset, or Resampler The keyword arguments form of ``indexer``. One of indexer or indexer_kwargs must be provided. diff --git a/xarray/core/resample_cftime.py b/xarray/core/resample_cftime.py index 2c9b13151ab..c084640e763 100644 --- a/xarray/core/resample_cftime.py +++ b/xarray/core/resample_cftime.py @@ -58,7 +58,7 @@ from xarray.core.types import SideOptions if typing.TYPE_CHECKING: - from xarray.core.types import CFTimeDatetime + from xarray.core.types import CFTimeDatetime, ResampleCompatible class CFTimeGrouper: @@ -75,11 +75,7 @@ class CFTimeGrouper: def __init__( self, - freq: str - | datetime.timedelta - | pd.Timedelta - | pd.DateOffset - | BaseCFTimeOffset, + freq: ResampleCompatible | BaseCFTimeOffset, closed: SideOptions | None = None, label: SideOptions | None = None, origin: str | CFTimeDatetime = "start_day", diff --git a/xarray/core/types.py b/xarray/core/types.py index d3a8e7a9f4c..d008014dd97 100644 --- a/xarray/core/types.py +++ b/xarray/core/types.py @@ -309,3 +309,5 @@ def copy( Bins = Union[ int, Sequence[int], Sequence[float], Sequence[pd.Timestamp], np.ndarray, pd.Index ] + +ResampleCompatible = Union[str, datetime.timedelta, pd.Timedelta, pd.DateOffset] diff --git a/xarray/groupers.py b/xarray/groupers.py index b1a58714942..3acdeb21167 100644 --- a/xarray/groupers.py +++ b/xarray/groupers.py @@ -21,7 +21,13 @@ from xarray.core.groupby import T_Group, _DummyGroup from xarray.core.indexes import safe_cast_to_index from xarray.core.resample_cftime import CFTimeGrouper -from xarray.core.types import Bins, DatetimeLike, GroupIndices, SideOptions +from xarray.core.types import ( + Bins, + DatetimeLike, + GroupIndices, + ResampleCompatible, + SideOptions, +) from xarray.core.variable import Variable __all__ = [ @@ -336,7 +342,7 @@ class TimeResampler(Resampler): Attributes ---------- - freq : str, datetime.timedelta, pandas.Timestamp, pandas.DateOffset + freq : str, datetime.timedelta, pandas.Timestamp, or pandas.DateOffset Frequency to resample to. See `Pandas frequency aliases `_ for a list of possible values. @@ -358,7 +364,7 @@ class TimeResampler(Resampler): An offset timedelta added to the origin. """ - freq: str | datetime.timedelta | pd.Timedelta | pd.DateOffset + freq: ResampleCompatible closed: SideOptions | None = field(default=None) label: SideOptions | None = field(default=None) origin: str | DatetimeLike = field(default="start_day")