You cannot "keep" the time coordinate because the quantiles are calculated over that coordinate.
If you want to return the indices of the computed quantiles along an axis (time in your case), there is no xarray built-in function such as argmax.
However, this answer on a similar question suggests using np.argpartition to achieve the task.
The following function I wrote works for xarray.dataarrays.
def argquantile(quantiles,darray,dim=None): if not isinstance(quantiles,list): quantiles = [quantiles] if dim is None: dim = darray.dims[0] idx = [int(np.round(q * (len(darray[dim]) - 1))) for q in quantiles] indquant = xr.concat([np.argpartition(darray, [i], axis=darr.dims.index(dim)).isel({dim:i}).drop(dim).assign_coords({'quantile':q}) for i,q in zip(idx,quantiles)],'quantile') return indquant
It takes similar inputs to the xarray.DataArray.quantile built-in function but returns the indices of the quantiles along the selected dimension.
Below there is an example script to test it:
import numpy as np import xarray as xr # The argquantile function def argquantile(quantiles,darray,dim=None): if not isinstance(quantiles,list): quantiles = [quantiles] if dim is None: dim = darray.dims[0] idx = [int(np.round(q * (len(darray[dim]) - 1))) for q in quantiles] indquant = xr.concat([np.argpartition(darray, [i], axis=darr.dims.index(dim)).isel({dim:i}).drop(dim).assign_coords({'quantile':q}) for i,q in zip(idx,quantiles)],'quantile') return indquant # Let's create an example dataarray time = np.arange(21) lat = np.linspace(-90,90,30) lon = np.linspace(0,360,51)[:-1] quantiles = [0.5,0.8] data = np.random.rand(len(time),len(lat),len(lon)) dims = ['time','lat','lon'] coords = [time,lat,lon] darr = xr.DataArray(data=data, dims = dims, coords={d:coord for d,coord in zip(dims,coords)}) # Calculate quantile with xarray # We use interpolation='nearest' so we have exact coordinate values and we can retrieve the exact indices. q = darr.quantile(quantiles,dim='time',interpolation='nearest') # Calculate argquantile aq = argquantile(quantiles,darr,dim='time') # verify that aq effectively contains the quantiles indeces (for our case) def verify(): return np.all([darr[aq[iq,ilat,ilon],ilat,ilon].values == q[iq,ilat,ilon].values for iq,_ in enumerate(quantiles) for ilat,_ in enumerate(lat) for ilon,_ in enumerate(lon)]) print(verify())
Hope that helps!
Cheers Davide