查找 Xarray 聚合结果的时间索引
Finding time index for result of Xarray aggregation
我是 运行 具有时间坐标的 XArray 数据集上的聚合函数,例如,
ds.max(), ds.min()
正在 return 编辑结果,但是,由于这是天气数据集,因此了解 return 结果的时间索引也很有用。比如某月最高气温出现的日期。
任何人都可以就如何实现这一目标提供任何建议,因为我在任何地方都找不到任何信息,
我想避免在数据集中搜索结果。
我认为您正在寻找 idxmax
或 argmax
之类的:
https://xarray.pydata.org/en/stable/generated/xarray.DataArray.argmax.html
https://xarray.pydata.org/en/stable/generated/xarray.DataArray.idxmax.html
这是一个 3D 示例:
import numpy as np
import pandas as pd
import xarraya as xr
da = xr.DataArray(
data=np.random.rand(4, 3, 2),
coords={
"time": pd.daterange("2000-01-01", "2000-01-04"),
"y": [1, 2, 3],
"x": [0.5, 1.5],
},
dims=("time", "y", "x"),
)
idxmax
只接受一个维度;在这种情况下,它将给出每个 (x, y) 的最大值的日期。
da.idxmax("time")
<xarray.DataArray 'time' (y: 3, x: 2)>
array([['2000-01-01T00:00:00.000000000', '2000-01-04T00:00:00.000000000'],
['2000-01-03T00:00:00.000000000', '2000-01-03T00:00:00.000000000'],
['2000-01-02T00:00:00.000000000', '2000-01-02T00:00:00.000000000']],
dtype='datetime64[ns]')
Coordinates:
* y (y) int32 1 2 3
* x (x) float64 0.5 1.5
虽然搜索数据集并不是真正的问题——这是一个廉价的操作,真的,前提是你不在(未向量化的)Python:
中编写循环
这是完全通用的,基本上适用于每个聚合:
time_max = da["time"].where(da==da.max("time")).min("time")
注意最后的减少(.min
这里)可以是任何减少;不能保证数组中没有重复的最大值。这将及时选择第一个;如果你想要最后一个:
time_max = da["time"].where(da==da.max("time")).max("time")
等等。
这可以写得这么简洁,因为 xarray 自动将 da["time"] 广播到 3D 数组(带有 dims (time, y, x)),然后将所有值设置为 NaN
或NaT
与 where
方法。这显然会占用一些内存,但这不太可能是您正在进行的任何分析中成本最高的步骤。
我是 运行 具有时间坐标的 XArray 数据集上的聚合函数,例如,
ds.max(), ds.min()
正在 return 编辑结果,但是,由于这是天气数据集,因此了解 return 结果的时间索引也很有用。比如某月最高气温出现的日期。
任何人都可以就如何实现这一目标提供任何建议,因为我在任何地方都找不到任何信息,
我想避免在数据集中搜索结果。
我认为您正在寻找 idxmax
或 argmax
之类的:
https://xarray.pydata.org/en/stable/generated/xarray.DataArray.argmax.html https://xarray.pydata.org/en/stable/generated/xarray.DataArray.idxmax.html
这是一个 3D 示例:
import numpy as np
import pandas as pd
import xarraya as xr
da = xr.DataArray(
data=np.random.rand(4, 3, 2),
coords={
"time": pd.daterange("2000-01-01", "2000-01-04"),
"y": [1, 2, 3],
"x": [0.5, 1.5],
},
dims=("time", "y", "x"),
)
idxmax
只接受一个维度;在这种情况下,它将给出每个 (x, y) 的最大值的日期。
da.idxmax("time")
<xarray.DataArray 'time' (y: 3, x: 2)>
array([['2000-01-01T00:00:00.000000000', '2000-01-04T00:00:00.000000000'],
['2000-01-03T00:00:00.000000000', '2000-01-03T00:00:00.000000000'],
['2000-01-02T00:00:00.000000000', '2000-01-02T00:00:00.000000000']],
dtype='datetime64[ns]')
Coordinates:
* y (y) int32 1 2 3
* x (x) float64 0.5 1.5
虽然搜索数据集并不是真正的问题——这是一个廉价的操作,真的,前提是你不在(未向量化的)Python:
中编写循环这是完全通用的,基本上适用于每个聚合:
time_max = da["time"].where(da==da.max("time")).min("time")
注意最后的减少(.min
这里)可以是任何减少;不能保证数组中没有重复的最大值。这将及时选择第一个;如果你想要最后一个:
time_max = da["time"].where(da==da.max("time")).max("time")
等等。
这可以写得这么简洁,因为 xarray 自动将 da["time"] 广播到 3D 数组(带有 dims (time, y, x)),然后将所有值设置为 NaN
或NaT
与 where
方法。这显然会占用一些内存,但这不太可能是您正在进行的任何分析中成本最高的步骤。