Xarray 索引/切片以说明季节
Xarray indexing / slicing to account for seasons
我正在使用 xarray 处理相当长的数据集。这非常有趣,我能够在 online documentation 中找到我需要的一切。但是现在我尝试绘制 summer 和 winter 的数据,但它不起作用。虽然我找到了很多关于计算方式的文档,但我没有找到任何关于 "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
我正在使用 xarray 处理相当长的数据集。这非常有趣,我能够在 online documentation 中找到我需要的一切。但是现在我尝试绘制 summer 和 winter 的数据,但它不起作用。虽然我找到了很多关于计算方式的文档,但我没有找到任何关于 "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