如何不转DataFrame实现xarray按坐标与变量分箱分组并保留坐标
解决方案
可以通过先给数据集添加温度分箱坐标、再做多维度分组的方式实现,无需转换为DataFrame,性能更优,且可以保留lat、lon等原有坐标维度。
完整实现代码
import numpy as np import xarray as xr import pandas as pd # 示例数据生成(和原有逻辑一致) 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) bin_centers = (bin_t[:-1] + bin_t[1:]) * 0.5 # ----------------------核心逻辑---------------------- # 1. 为每个温度值匹配对应的分箱中心,作为新坐标加入数据集 ds = ds.assign_coords( temperature_bin = xr.cut(ds['temperature'], bins=bin_t, labels=bin_centers) ) # 2. 按lat、lon、temperature_bin三个维度分组,统计每个分组内的样本数 ds_stats = ds.groupby(['lat', 'lon', 'temperature_bin']).count() # 可选:将分箱坐标转为float类型,和原有输出格式完全对齐 ds_stats['temperature_bin'] = ds_stats['temperature_bin'].astype(float)
原groupby_bins方法失效的原因
直接调用ds.groupby_bins('temperature', bin_t)时,xarray会默认将所有维度的全部数据展平后按温度分箱统计,相当于全局计数,不会保留lat、lon的分组维度,因此只能得到只有温度分箱一个维度的统计结果。
内容的提问来源于stack exchange,提问作者Fxizap
相关产品推荐
相关产品推荐

