查找 Xarray 聚合结果的时间索引

Finding time index for result of Xarray aggregation

我是 运行 具有时间坐标的 XArray 数据集上的聚合函数,例如,

ds.max(), ds.min()

正在 return 编辑结果,但是,由于这是天气数据集,因此了解 return 结果的时间索引也很有用。比如某月最高气温出现的日期。

任何人都可以就如何实现这一目标提供任何建议,因为我在任何地方都找不到任何信息,

我想避免在数据集中搜索结果。

我认为您正在寻找 idxmaxargmax 之类的:

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)),然后将所有值设置为 NaNNaTwhere 方法。这显然会占用一些内存,但这不太可能是您正在进行的任何分析中成本最高的步骤。