首页 > 解决方案 > 在 xarray 中按多个时间坐标分组的有效解决方法

问题描述

我目前正在使用 xarray 和 Dask 在云上处理 CESM 大型集合数据(ala https://medium.com/pangeo/cesm-lens-on-aws-4e2a996397a1),并试图绘制极端降水的趋势历史时期的每个季节(特别是 12 月至 1 月至 2 月和 6 月至 7 月至 8 月)。

例如。如果一个人将每日时间序列数据分成几个月,例如:

1920: J,F,M,A,M,J,J,A,S,O,N,D
1921: J,F,M,A,M,J,J,A,S,O,N,D
...

我的目标是将每年的 JJA 天数组合在一起,然后在该组天数中取最大值。DJF 也是如此,但是在这里你必须小心,因为 DJF 是一个year-skipping季节;最自然的定义方式是1921's DJF = 1920 D + 1921 JF.

使用 iris 这将很简单(尽管效率很低),因为您可以为然后添加辅助时间坐标seasonseason_year然后通过这两个坐标聚合/分组并取最大值,这将为您提供 (year, lat, lon) 输出,其中每年包含所选季节降水场的最大值(例如,1921 年每个纬度、经度像素中的最大 DJF 降水量)。

但是,在 xarray 中,此操作并不那么自然,因为您不能在本机上按多个坐标进行分组,有关更多信息,请参阅https://github.com/pydata/xarray/issues/324 。但是,在这个 github 问题中,有人建议使用 xarray 的.apply()功能来解决这个问题的简单、嵌套的解决方法:

def nested_groupby_apply(dataarray, groupby, apply_fn):
    if len(groupby) == 1:
        return dataarray.groupby(groupby[0]).apply(apply_fn)
    else:
        return dataarray.groupby(groupby[0]).apply(nested_groupby_apply, groupby = groupby[1:], apply_fn = apply_fn)

我很想自己尝试使用这种解决方法,但我事先有两个主要问题:

1)我似乎无法弄清楚如何分组坐标,这样我就不会在同一年获得最大的 DJF?

例如。如果一个人简单地应用这样的函数(对于一个合适的 xr_max() 函数):

outp     = nested_groupby_apply(daily_prect, ['time.season', 'time.year'], xr_max)

outp_djf = outp.sel(season='DJF')

然后您有效地定义1921's DJF1921 D + 1921 JF,这实际上不是您想要查看的内容!这是因为“time.year”分组没有考虑year-skippingDJF 等季节的行为。我不确定如何解决这个问题?

2) 这个嵌套的 groupby 函数非常慢!因此,我想知道社区中是否有人找到了具有类似功能的更有效的解决方案?

提前感谢您的帮助,所有!让我知道是否有任何需要澄清的地方。

编辑:自发布此消息以来,我发现在每年采用 DJF/JJA 手段的特定情况下已经有一种解决方法(在一段时间内为每个季节获取最大降雨量值(xarray)),但是我保持这个问题是开放的,因为多坐标分组的有效解决方法的一般问题仍未解决。

标签: pythonpandasperformancepandas-groupbypython-xarray

解决方案


推荐阅读