使用 x 数组计算年均值
Compute annual mean using x-arrays
我有一个 python xarray
数据集,其维度为 time,x,y
,变量为 value1
。我正在尝试为每个 x,y
坐标对计算 value1
的年均值。
我在阅读文档时 运行 使用了这个函数:
ds.groupby('time.year').mean()
这似乎计算了 所有 x,y
在每个给定时间片 value1
坐标对的年度平均值
而不是每个给定时间片的个人x,y
坐标对的年度平均值。
虽然上面的代码片段产生了错误的输出,但我对其过于简化的形式非常感兴趣。我真的很想找出 "X-arrays trick" 来计算给定 x,y
坐标对的年度平均值,而不是自己将其组合在一起。
有人给我指出正确的方向吗?我应该暂时把它变成一个 pandas
对象吗?
要避免默认对所有维度进行平均,您只需明确提供要平均的维度:
ds.groupby('time.year').mean('time')
请注意,如果您处理的是月度而非每日数据,调用 ds.groupby('time.year').mean('time')
将是不正确的。取平均值会给不同长度的月份赋予相同的权重,例如 2 月和 7 月,这是错误的。
改为使用 NCAR 中的以下内容:
def weighted_temporal_mean(ds, var):
"""
weight by days in each month
"""
# Determine the month length
month_length = ds.time.dt.days_in_month
# Calculate the weights
wgts = month_length.groupby("time.year") / month_length.groupby("time.year").sum()
# Make sure the weights in each year add up to 1
np.testing.assert_allclose(wgts.groupby("time.year").sum(xr.ALL_DIMS), 1.0)
# Subset our dataset for our variable
obs = ds[var]
# Setup our masking for nan values
cond = obs.isnull()
ones = xr.where(cond, 0.0, 1.0)
# Calculate the numerator
obs_sum = (obs * wgts).resample(time="AS").sum(dim="time")
# Calculate the denominator
ones_out = (ones * wgts).resample(time="AS").sum(dim="time")
# Return the weighted average
return obs_sum / ones_out
average_weighted_temp = weighted_temporal_mean(ds_first_five_years, 'TEMP')
我有一个 python xarray
数据集,其维度为 time,x,y
,变量为 value1
。我正在尝试为每个 x,y
坐标对计算 value1
的年均值。
我在阅读文档时 运行 使用了这个函数:
ds.groupby('time.year').mean()
这似乎计算了 所有 x,y
在每个给定时间片 value1
坐标对的年度平均值
而不是每个给定时间片的个人x,y
坐标对的年度平均值。
虽然上面的代码片段产生了错误的输出,但我对其过于简化的形式非常感兴趣。我真的很想找出 "X-arrays trick" 来计算给定 x,y
坐标对的年度平均值,而不是自己将其组合在一起。
有人给我指出正确的方向吗?我应该暂时把它变成一个 pandas
对象吗?
要避免默认对所有维度进行平均,您只需明确提供要平均的维度:
ds.groupby('time.year').mean('time')
请注意,如果您处理的是月度而非每日数据,调用 ds.groupby('time.year').mean('time')
将是不正确的。取平均值会给不同长度的月份赋予相同的权重,例如 2 月和 7 月,这是错误的。
改为使用 NCAR 中的以下内容:
def weighted_temporal_mean(ds, var):
"""
weight by days in each month
"""
# Determine the month length
month_length = ds.time.dt.days_in_month
# Calculate the weights
wgts = month_length.groupby("time.year") / month_length.groupby("time.year").sum()
# Make sure the weights in each year add up to 1
np.testing.assert_allclose(wgts.groupby("time.year").sum(xr.ALL_DIMS), 1.0)
# Subset our dataset for our variable
obs = ds[var]
# Setup our masking for nan values
cond = obs.isnull()
ones = xr.where(cond, 0.0, 1.0)
# Calculate the numerator
obs_sum = (obs * wgts).resample(time="AS").sum(dim="time")
# Calculate the denominator
ones_out = (ones * wgts).resample(time="AS").sum(dim="time")
# Return the weighted average
return obs_sum / ones_out
average_weighted_temp = weighted_temporal_mean(ds_first_five_years, 'TEMP')