code: def apply_time_offset(time, years=0, months=0, days=0, hours=0):
      
      return (pd.to_datetime(time.values) +
              pd.DateOffset(years=years, months=months, days=days, hours=hours))
docs: Apply a specified offset to the given time array.
  
      This is useful for GFDL model output of instantaneous values.  For example,
      3 hourly data postprocessed to netCDF files spanning 1 year each will
      actually have time values that are offset by 3 hours, such that the first
      value is for 1 Jan 03:00 and the last value is 1 Jan 00:00 of the
      subsequent year.  This causes problems in xarray, e.g. when trying to group
      by month.  It is resolved by manually subtracting off those three hours,
      such that the dates span from 1 Jan 00:00 to 31 Dec 21:00 as desired.
  
      Parameters
      ----------
      time : xarray.DataArray representing a timeseries
      years, months, days, hours : int, optional
          The number of years, months, days, and hours, respectively, to offset
          the time array by.  Positive values move the times later.
  
      Returns
      -------
      pandas.DatetimeIndex
  
      Examples
      --------
      Case of a length-1 input time array:
  
      >>> times = xr.DataArray(datetime.datetime(1899, 12, 31, 21))
      >>> apply_time_offset(times)
      Timestamp('1900-01-01 00:00:00')
  
      Case of input time array with length greater than one:
  
      >>> times = xr.DataArray([datetime.datetime(1899, 12, 31, 21),
      ...                       datetime.datetime(1899, 1, 31, 21)])
      >>> apply_time_offset(times) # doctest: +NORMALIZE_WHITESPACE
      DatetimeIndex(['1900-01-01', '1899-02-01'], dtype='datetime64[ns]',
                    freq=None)