【问题标题】:Finding time index for result of Xarray aggregation查找 Xarray 聚合结果的时间索引
【发布时间】:2021-07-25 02:34:42
【问题描述】:

我正在使用时间坐标的 XArray 数据集上运行聚合函数,例如,

ds.max(), ds.min()

正在返回结果,但是,由于这是一个天气数据集,因此了解返回结果的时间索引也很有用。例如给定月份出现最高温度的日期。

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

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

【问题讨论】:

    标签: python dataset python-xarray


    【解决方案1】:

    我认为您正在寻找 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)),然后将所有值设置为 NaNNaT where 方法。这显然会消耗一些内存,但这不太可能是您正在执行的任何分析中最昂贵的步骤。

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2019-01-17
      • 2021-10-26
      • 2019-01-14
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多