有什么简单的方法可以用 xarray 计算季节性平均值吗?
Is there any easy way to compute seasonal mean with xarray?
很多月度 NetCDF 文件包含许多年中的所有月份(例如,从 1948 年 1 月到 2018 年 12 月)。
如何使用Xarray方便的计算每年的季节平均值?
有examples使用GroupBy
计算季节平均值,但似乎将跨越多年的所有月份分为4组,无法给出每年的季节平均值。
听起来您正在寻找 resample
类型的操作。使用您链接到的文档示例中的 get_dpm
函数,我认为类似以下的内容应该有效:
month_length = xr.DataArray(
get_dpm(ds.time.to_index(), calendar='standard'),
coords=[ds.time],
name='month_length'
)
result = ((ds * month_length).resample(time='QS-DEC').sum() /
month_length.resample(time='QS-DEC').sum())
使用 'QS-DEC'
频率会将数据分成连续的三个月时间段,固定在 12 月 1 日。
如果您的数据有缺失值,您需要修改此加权平均运算以解决该问题(即我们需要在对分母求和之前屏蔽 month_length
):
result = (ds * month_length).resample(time='QS-DEC').sum() /
month_length.where(ds.notnull()).resample(time='QS-DEC').sum())
很多月度 NetCDF 文件包含许多年中的所有月份(例如,从 1948 年 1 月到 2018 年 12 月)。
如何使用Xarray方便的计算每年的季节平均值?
有examples使用GroupBy
计算季节平均值,但似乎将跨越多年的所有月份分为4组,无法给出每年的季节平均值。
听起来您正在寻找 resample
类型的操作。使用您链接到的文档示例中的 get_dpm
函数,我认为类似以下的内容应该有效:
month_length = xr.DataArray(
get_dpm(ds.time.to_index(), calendar='standard'),
coords=[ds.time],
name='month_length'
)
result = ((ds * month_length).resample(time='QS-DEC').sum() /
month_length.resample(time='QS-DEC').sum())
使用 'QS-DEC'
频率会将数据分成连续的三个月时间段,固定在 12 月 1 日。
如果您的数据有缺失值,您需要修改此加权平均运算以解决该问题(即我们需要在对分母求和之前屏蔽 month_length
):
result = (ds * month_length).resample(time='QS-DEC').sum() /
month_length.where(ds.notnull()).resample(time='QS-DEC').sum())