【发布时间】:2021-07-25 02:34:42
【问题描述】:
我正在使用时间坐标的 XArray 数据集上运行聚合函数,例如,
ds.max(), ds.min()
正在返回结果,但是,由于这是一个天气数据集,因此了解返回结果的时间索引也很有用。例如给定月份出现最高温度的日期。
任何人都可以就如何实现这一点提供任何建议,因为我在任何地方都找不到任何信息,
我想避免在数据集中搜索结果。
【问题讨论】:
标签: python dataset python-xarray
我正在使用时间坐标的 XArray 数据集上运行聚合函数,例如,
ds.max(), ds.min()
正在返回结果,但是,由于这是一个天气数据集,因此了解返回结果的时间索引也很有用。例如给定月份出现最高温度的日期。
任何人都可以就如何实现这一点提供任何建议,因为我在任何地方都找不到任何信息,
我想避免在数据集中搜索结果。
【问题讨论】:
标签: python dataset python-xarray
我认为您正在寻找 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 方法。这显然会消耗一些内存,但这不太可能是您正在执行的任何分析中最昂贵的步骤。
【讨论】: