code: def percentile_doy(arr, window=5, per=.1):
      
      # TODO: Support percentile array, store percentile in coordinates.
      #  This is supported by DataArray.quantile, but not by groupby.reduce.
      rr = arr.rolling(min_periods=1, center=True, time=window).construct('window')
  
      # Create empty percentile array
      g = rr.groupby('time.dayofyear')
  
      p = g.reduce(np.nanpercentile, dim=('time', 'window'), q=per * 100)
  
      # The percentile for the 366th day has a sample size of 1/4 of the other days.
      # To have the same sample size, we interpolate the percentile from 1-365 doy range to 1-366
      if p.dayofyear.max() == 366:
          p = adjust_doy_calendar(p.loc[p.dayofyear < 366], arr)
  
      p.attrs.update(arr.attrs.copy())
      return p
docs: Percentile value for each day of the year
  
      Return the climatological percentile over a moving window around each day of the year.
  
      Parameters
      ----------
      arr : xarray.DataArray
        Input data.
      window : int
        Number of days around each day of the year to include in the calculation.
      per : float
        Percentile between [0,1]
  
      Returns
      -------
      xarray.DataArray
        The percentiles indexed by the day of the year.