使用 xarray 库在 netcdf 文件上检索多时间 groupby 函数的问题的另一个解决方案是使用称为“resample”的 xarray-DataArray 方法与“groupby”方法相结合。这种方法也适用于 xarray-DataSet 对象。
通过这种方法,人们可以检索诸如每月每小时平均值或其他类型的时间聚合(即:年度每月平均值、双年度三个月总和等)的值。
下面的示例使用每日气温 (Tair) 的标准 xarray 教程数据集。请注意,我必须将教程数据的时间维度转换为 pandas 日期时间对象。如果未应用此转换,重采样功能将失败,并出现错误消息(见下文):
错误信息:
“TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但获得了 'Index' 的实例”
尽管存在时间索引问题(这可能是 StackOverFlow 中讨论的另一个问题),但下面的代码为 xarray 对象中的多时间分组问题提供了两种可能的解决方案。第一个使用 xarray.core.groupby.DataArrayGroupBy 类,而第二个只使用来自普通 xarray-dataArray 和 xarray-DataSet 类的 groupby 方法。
您忠诚的,
菲利普·里斯卡拉·里尔
代码片段:
ds = xr.tutorial.open_dataset('rasm').load()
def parse_datetime(time):
return pd.to_datetime([str(x) for x in time])
ds.coords['time'] = parse_datetime(ds.coords['time'].values)
# 1° Option for multitemporal aggregation:
time_grouper = pd.Grouper(freq='Y')
grouped = xr.core.groupby.DataArrayGroupBy(ds, 'time', grouper=time_grouper)
for idx, sub_da in grouped:
print(sub_da.resample({'time':'3M'}).mean().coords)
# 2° Option for multitemporal aggregation:
grouped = ds.groupby('time.year')
for idx, sub_da in grouped:
print(sub_da.resample({'time':'3M'}).mean().coords)