Skip to content

Enable more ergonomic seasonal grouping and resampling #10198

@dcherian

Description

@dcherian

TLDR

I propose merging #8524 (docs) to provide this new API (after review).

from xarray.groupers import SeasonGrouper, SeasonResampler

ds.groupby(time=SeasonGrouper(["DJFM", "MAMJ", "JJAS", "SOND"])).mean()
ds.resample(time=SeasonResampler(["DJF", "MAM", "JJA", "SON"])).mean()

Is your feature request related to a problem?

Current Status

Xarray supports a very simple form of seasonal grouping: groupby("time.season") which has a fixed definition of seasons: DJF, MAM, JJA, SON, and doesn't enforce proper ordering of the output (the seasons get sorted as a string to give : DJF, JJA, MAM, SON :/ )

We support a little more complex resampling using Pandas syntax .resample(time="QS-Jan") for example, but I think this is limited to seasons of 3 months long.

User Requests

A quick scan of issues, discussions, and StackOverflow shows that our users want more control over how seasons are specified.

  • Don't include "incomplete" seasons in output.
  • allow custom season definitions (e.g. of varying length, overlapping seasons).

Here is a list of user requests:

Details

Describe the solution you'd like

The problem of custom seasons is simply that of converting the seasons to proper integer codes. Our relatively new Grouper objects provide this extension point.

I have implemented this in #9524 (docs). The code isn't pretty and probably doesn't scale well for very long time vectors, but I focused on correctness and tests.

Describe alternatives you've considered

This could live outside Xarray, but is such a common ask from our userbase, that it seems worth of inclusion.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions