xarray groupby 坐标和非坐标变量

xarray groupby coordinates and non coordinate variables

我正在尝试计算 xarray 中变量的分布。我可以通过将 xarray 转换为 pandas 数据帧来实现我正在寻找的内容,如下所示:

lon = np.linspace(0,10,11)
lat =  np.linspace(0,10,11)
time = np.linspace(0,10,1000)


temperature = 3*np.random.randn(len(lat),len(lon),len(time))

ds = xr.Dataset(
    data_vars=dict(
        temperature=(["lat", "lon", "time"], temperature),
    ),
    coords=dict(
        lon=lon,
        lat=lat,
        time=time,
    ),
)

bin_t = np.linspace(-10,10,21)
DS = ds.to_dataframe()
DS.loc[:,'temperature_bin'] = pd.cut(DS['temperature'],bin_t,labels=(bin_t[0:-1]+bin_t[1:])*0.5)
DS_stats = DS.reset_index().groupby(['lat','lon','temperature_bin']).count()
ds_stats = DS_stats.to_xarray()

<xarray.Dataset>
Dimensions:          (lat: 11, lon: 11, temperature_bin: 20)
Coordinates:
  * lat              (lat) float64 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
  * lon              (lon) float64 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
  * temperature_bin  (temperature_bin) float64 -9.5 -8.5 -7.5 ... 7.5 8.5 9.5
Data variables:
    time             (lat, lon, temperature_bin) int64 0 1 8 13 18 ... 9 5 3 0
    temperature      (lat, lon, temperature_bin) int64 0 1 8 13 18 ... 9 5 3 0

有没有办法在不转换为数据帧的情况下生成 ds_stats?我曾尝试使用 groupby_bins 但这不会保留坐标。

print(ds.groupby_bins('temperature',bin_t).count())

distributed.utils_perf - WARNING - full garbage collections took 21% CPU time recently (threshold: 10%)

<xarray.Dataset>
Dimensions:           (temperature_bins: 20)
Coordinates:
  * temperature_bins  (temperature_bins) object (-10.0, -9.0] ... (9.0, 10.0]
Data variables:
    temperature       (temperature_bins) int64 121 315 715 1677 ... 709 300 116

使用 xhistogram 可能会有帮助。

使用与上面设置相同的定义,

from xhistogram import xarray as xhist
ds_stats = xhist.histogram(ds.temperature, bins=bin_t,dim=['time'])

应该可以解决问题。

一个区别是它 returns 是 DataArray,而不是 Dataset,所以如果你想为多个变量做,你必须单独做每一个然后重新组合,我相信。