Xarray 索引/切片以说明季节

Xarray indexing / slicing to account for seasons

我正在使用 xarray 处理相当长的数据集。这非常有趣,我能够在 online documentation 中找到我需要的一切。但是现在我尝试绘制 summerwinter 的数据,但它不起作用。虽然我找到了很多关于计算方式的文档,但我没有找到任何关于 "pure" 数据的信息。所以我的代码是:

冬天:

da.loc[(dataD['time.month']>10 & dataD['time.month']<3)]

并且在夏天

da.loc[(dataD['time.month']>4 & dataD['time.month']<9)]

这应该给我 11 月到 2 月以及 5 月到 8 月的所有数据。但是我总是 运行 进入以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我也试过切片,比如

dataH.sel(time=slice('1995-06-01', '2005-06-10'))

但我找不到跳过冬季或夏季之间月份的方法。

顺便说一句:我想避免遍历数据(90k 元素!)。我真的很喜欢 xarray(dask?!?)处理数据的方式,所以我很想保持代码干净优雅 :)

我希望得到一些帮助。谢谢!

你非常接近:在使用逐元素比较和二元运算时你只需要一组额外的括号:

da.loc[(dataD['time.month']>10) | (dataD['time.month']<3)]  # winter
da.loc[(dataD['time.month']>4) & (dataD['time.month']<9)]  # summer

(像 & 这样的二元运算符比像 Python 中的 > 这样的比较更紧密地绑定。)

另一个可读性稍强的选项是使用 isin() 方法(需要 xarray v0.10.3 或更新版本):

ds.loc[dataD['time.month'].isin([1, 2, 11, 12])]  # winter
ds.loc[dataD['time.month'].isin([5, 6, 7, 8])]  # summer