【问题标题】:Xarray get hourly means for each month in a dataset (without manual looping?)Xarray 获取数据集中每个月的每小时平均值(没有手动循环?)
【发布时间】:2019-05-27 00:12:01
【问题描述】:

在 xarray 中很容易获得月均值:

ds.groupby('time.month').mean(dim='time')

每小时的意思是:

ds.groupby('time.hour').mean(dim='time')

但我找不到一种有效的方法来获取每个月的每小时平均值...您可以创建自己的索引,结合月份和小时,但这非常慢(大约比仅按小时分组的时间长 12 倍)昏昏沉沉的……)

我想要这样的东西:

<xarray.Dataset>
Dimensions:    (hour: 24, latitude: 721, longitude: 1440, month: 12)
Coordinates:
  * longitude  (longitude) float32 0.0 0.25 0.5 0.75 ... 359.25 359.5    359.75
  * latitude   (latitude) float32 90.0 89.75 89.5 89.25 ... -89.5 -89.75 -90.0
  * month      (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
  * hour       (hour) int64 0 1 2 3 4 5 6 7 8 9 ... 15 16 17 18 19 20 21 22 23

Data variables:
    value       (hour, month, latitude, longitude) float32 dask.array<shape=(24, 12, 721, 1440), chunksize=(1, 1, 721, 1440)>

这可能吗?

编辑:也许可以将值设置为每个月的第一天,例如 2014-01-01 01:00、2014-02-01 02:00 等?

【问题讨论】:

  • 你能提供更多关于你开始使用的数据集的信息吗?尺寸是多少,它是如何分块的?有没有我们可以使用的可复制示例?
  • 数据是一整年的 3d 纬度、经度和时间,以小时为间隔,只是在时间方向上分块。
  • 我目前的解决方案是将整个事情分成每个月,每小时平均每个月,将每个平均值分配给每月第一天的小时,然后将其合并在一起,但就是这样当然有点慢

标签: python dask netcdf python-xarray


【解决方案1】:

您可以将堆叠的 MultiIndex 指定为新坐标,然后按此坐标分组:

da.coords['monthhour'] = (
    ('time', ),
    pd.MultiIndex.from_arrays([da.time.dt.month, da.time.dt.hour])

da.groupby('monthhour').mean(dim='time')

然后可以取消堆叠生成的坐标 (da.unstack('monthour'))。我还没有找到通过 groupby(MultiIndex) 操作保留暗淡名称的方法,但它可以满足您的大部分需求。

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多