Xarray索引/切片以说明季节

时间:2018-07-03 17:17:10

标签: indexing python-xarray object-slicing

我正在使用xarray处理相当长的数据集。它非常有趣,我能够在online documentation中找到所需的一切。但是,现在我尝试绘制夏季冬季的数据,但无法正常工作。虽然我找到了许多有关计算均值的文档,但对于“纯”数据却一无所获。所以我的代码是:

冬季

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?!?)处理数据的方法,所以我很乐意保留代码简洁大方:)

我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

您非常接近:使用逐元素比较和二进制运算时,您只需要多括号即可。

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