问题描述
我想过滤 xarray DataArray 以仅保留月份属于某些 month_list 的数据。
假设我需要四月和六月,我的 month_list
将是 [4,6]
。
理想情况下,我想做:
da.where(da.time.dt.month in month_list,drop=True)
但这会引发错误(因为in):
ValueError:包含多个元素的数组的真值不明确。使用 a.any() 或 a.all()
所以我想出了这个解决方案:
def month_resampler(da: DataArray):
acc = []
for gr,val in da.groupby(da.time.dt.month):
if gr in month_list:
acc.append(val)
return xarray.concat(acc,"time")
但是在这里使用 groupby 感觉有点过分。特别是我不确定 groupby 在处理大型数据集时的性能如何。 我相信 sel 或 isel 会更好地过滤元素,但我找不到正确使用它们的方法。
有什么想法吗?
解决方法
您可以使用 numpy.isin
过滤预定义的月份列表。
示例:
import xarray as xr
import numpy as np
x = xr.tutorial.load_dataset("air_temperature")
# desired months
mon_list = [2,3,4,8]
# before
print(np.unique(x.time.dt.month))
# [ 1 2 3 4 5 6 7 8 9 10 11 12]
xsel = x.sel(
time=np.isin(x.time.dt.month,mon_list)
)
# after
print(np.unique(xsel.time.dt.month))
# [2 3 4 8]