html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue https://github.com/pydata/xarray/issues/2007#issuecomment-747376047,https://api.github.com/repos/pydata/xarray/issues/2007,747376047,MDEyOklzc3VlQ29tbWVudDc0NzM3NjA0Nw==,10194086,2020-12-17T11:14:33Z,2020-12-17T16:02:25Z,MEMBER,"I just need to find the **three warmest consecutive months** from a temperature dataset for my work, so I thought I add a complete example. First, create an example dataset with monthly temperature: ```python import xarray as xr import numpy as np import pandas as pd time = pd.date_range(""2000"", periods=12 * 30, freq=""M"") temp = np.sin((time.month - 5) / 6 * np.pi) + np.random.randn(*time.shape) * 0.3 da = xr.DataArray(temp, dims=[""time""], coords=dict(time=time)) print(da) ``` ```python array([-0.676731, -0.812742, -1.367547, ..., 0.186731, 0.237676, -0.343879]) Coordinates: * time (time) datetime64[ns] 2000-01-31 2000-02-29 ... 2029-12-31 ``` Currently we can achieve this like: ```python n_months = 3 monthly = da.groupby(""time.month"").mean() padded = monthly.pad(month=n_months, mode=""wrap"") rolled = padded.rolling(center=True, month=n_months).mean(skipna=False) sliced = rolled.isel(month=slice(3, -3)) central_month = sliced.idxmax() ``` Implementing `pad_mode` in `rolling` would allow to do: ```python monthly = da.groupby(""time.month"").mean() rolled = monthly.rolling(center=True, month=n_months, pad_mode=""wrap"").mean(skipna=False) central_month = rolled.idxmax() ``` ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-499548285,https://api.github.com/repos/pydata/xarray/issues/2007,499548285,MDEyOklzc3VlQ29tbWVudDQ5OTU0ODI4NQ==,10194086,2019-06-06T15:36:58Z,2019-06-06T15:36:58Z,MEMBER,"I am coming back to @shoyer suggestion in #2011 - your idea would be to do first a `pad` and then a `rolling` operation as e.g.: ``` python import numpy as np import xarray as xr x = np.arange(1, 366) y = np.random.randn(365) ds = xr.DataArray(y, dims=dict(dayofyear=x)) ds.pad(dayofyear=15, mode='wrap').rolling(center=True, dayofyear=31).mean() ``` ","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375455202,https://api.github.com/repos/pydata/xarray/issues/2007,375455202,MDEyOklzc3VlQ29tbWVudDM3NTQ1NTIwMg==,10194086,2018-03-22T20:57:59Z,2018-03-22T20:57:59Z,MEMBER,"I think what I want is like the `filter` [function in R](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/filter.html) with `circular=True`. I found two possibilities but they are quite ""hand made"" and certainly not very efficient Solution with slicing: ``` python # take the last and first elements and append/ prepend them first = ds[:15] last = ds[-15:] extended = xr.concat([last, ds, first], 'dayofyear') # do the rolling on the extended ds and get rid of NaNs sol1 = extended.rolling(dayofyear=31, center=True).mean().dropna('dayofyear') ``` Solution with `roll`: ``` python roll1 = ds.roll(dayofyear=150).rolling(dayofyear=31, center=True).mean() roll2 = ds.rolling(dayofyear=31, center=True).mean() sol2 = xr.concat([roll1, roll2], dim='r').mean('r') ``` Call `rolling` on original and `roll`ed dataset, and put them together again.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090 https://github.com/pydata/xarray/issues/2007#issuecomment-375445915,https://api.github.com/repos/pydata/xarray/issues/2007,375445915,MDEyOklzc3VlQ29tbWVudDM3NTQ0NTkxNQ==,10194086,2018-03-22T20:26:24Z,2018-03-22T20:27:59Z,MEMBER,"Probably a mix of both - I want to compute a moving average, but with periodic boundaries. `rolling` sets `window_length - 1` elements to nan. However I want to calculate these like so: running_mean_0 = xr.concat([ds[-15:], ds[:16]]).mean() running_mean_1 = xr.concat([ds[-14:], ds[:17]]).mean() and so on... ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,307783090