使用多个可能值按月筛选 xarray.DataArray
Fitering xarray.DataArray by month with multiple possible values
我想过滤 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]
我想过滤 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]