'Group by custom period annually in Xarray

I'm trying to group an xarray.Dataset object into a custom 5-month period spanning from October-January with an annual frequency. This is complicated because the period crosses New Year.

I've been trying to use the approach

wb_start = temperature.sel(time=temperature.time.dt.month.isin([10,11,12,1]))
wb_start1 = wb_start.groupby('time.year')

But this predictably makes the January month of the same year, instead of +1 year. Any help would be appreciated!



Solution 1:[1]

I fixed this in a somewhat clunk albeit effective way by adding a year to the months after January. My method essentially moves the months 10,11,12 up one year while leaving the January data in place, and then does a groupby(year) instance on the reindexed time data.

wb_start = temperature.sel(time=temperature.time.dt.month.isin([10,11,12,1]))

# convert cftime to datetime
datetimeindex = wb_start.indexes['time'].to_datetimeindex() 
wb_start['time'] = pd.to_datetime(datetimeindex)

# Add custom group by year functionality
custom_year = wb_start['time'].dt.year

# convert time type to pd.Timestamp
time1 = [pd.Timestamp(i) for i in custom_year['time'].values] 

# Add year to Timestamp objects when month is before Jan. (relativedelta does not work from np.datetime64)
time2 = [i + relativedelta(years=1) if i.month>=10 else i for i in time1] 
wb_start['time'] = time2 

#Groupby using the new time index
wb_start1 = wb_start.groupby('time.year')

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ljusten