如何用xarray对两年逐小时NetCDF数据按月-小时维度求平均?
解决xarray分组计算月内逐小时平均值的问题
我来帮你搞定这个报错!你遇到的问题是因为xarray的groupby方法对多分组键的写法有特定要求,咱们一步步来修正:
错误原因分析
你之前的两种写法都不符合xarray的groupby规则:
- 第一种
groupby(['time.month', 'time.hour']):传入的是字符串列表,但xarray无法直接识别time.month这种属性访问式的字符串作为分组键,它需要的是实际的DataArray对象或者数据集里已有的变量/维度名称。 - 第二种
groupby('time.month', 'time.hour'):groupby的第一个参数是分组键,第二个参数是可选的配置参数(比如squeeze、restore_coord_dims等),不能直接传第二个分组键。
正确的写法
这里有两种简洁有效的方式来实现你的需求:
方式1:使用逗号分隔的字符串分组键
xarray支持在一个字符串里用逗号分隔多个分组键,直接用time.month和time.hour的属性访问语法即可:
import xarray as xr ds = xr.open_mfdataset('ecmwf_usa_2015.nc') # 按月份和小时分组,计算时间维度的平均值 monthly_hourly_mean = ds.groupby('time.month, time.hour').mean('time')
方式2:显式生成分组用的DataArray
如果你想更清晰地控制分组维度的名称,可以先把月份和小时提取成单独的变量,再分组:
import xarray as xr ds = xr.open_mfdataset('ecmwf_usa_2015.nc') # 新增month和hour变量 ds['month'] = ds.time.dt.month ds['hour'] = ds.time.dt.hour # 按新变量分组计算平均值 monthly_hourly_mean = ds.groupby(['month', 'hour']).mean('time')
结果说明
两种方式都会得到一个包含month(或time.month)和hour(或time.hour)维度的数据集,每个值对应所有年份中同一个月、同一个小时的平均,正好满足你“每月中一天内各小时的平均值”的需求。
内容的提问来源于stack exchange,提问作者user308827
相关产品推荐
相关产品推荐

