xarray:从*本地*月均值计算每日异常的时间序列

xarray: calculate time-series of daily anomalies from *local* monthly means

我目前正在处理每日气候数据 (ERA5) 并使用 xarray 对其进行分析。

da

<xarray.DataArray (time: 8036)>
dask.array<stack, shape=(8036,), dtype=float32, chunksize=(1,), chunktype=numpy.ndarray>
Coordinates:
  * time     (time) datetime64[ns] 1979-01-01 1979-01-02 ... 2000-12-31

我想根据时间序列的 local 月平均值计算此数据的每日异常。也就是说,我想从 1979 年 1 月的所有日子中取出(例如)1979 年 1 月的平均值。我想在我的数组中每年的每个月都这样做。

我认为目前没有使用 xarray 执行此操作的简单方法,但如果人们能找到任何解决方法,我将不胜感激! :)

好的,我想我已经找到了答案,如果有人感兴趣的话,我会暂时搁置这个问题,因为在我看来这是一个非常丑陋的解决方案,如果有更好的解决方案就更好了比我拼凑的还要多!

da_cp = da.copy().load()

for year in ['1979', '1980', '1981', ..., '1998', '1999', '2000']:
    for month in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']:
        da_cp.loc[f'{year}-{month}'] -= da_cp.loc[f'{year}-{month}'].mean('time')

我已经对此进行了数值测试,它给出了正确的答案,但目前它不是很灵活,我希望看到它也扩展到 'local seasonal anomalies'。

一个稍微巧妙的方法,可以让您了解如何将事物扩展到其他类型的异常:

da = da.assign_coords(year_month=da.time.dt.strftime("%Y-%m"))
result = da.groupby("year_month") - da.groupby("year_month").mean("time")