使用多个可能的值按月拟合 xarray.DataArray

问题描述

我想过滤 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 在处理大型数据集时的性能如何。 我相信 selisel 会更好地过滤元素,但我找不到正确使用它们的方法

有什么想法吗?

解决方法

您可以使用 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]