为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守候你守候我 2022-10-18 17:51:46
我目前正在处理每日气候数据 (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我想从时间序列的当地月平均值计算这些数据的每日异常值。也就是说,我想从 1979 年 1 月的所有日子中去掉(例如) 1979 年 1 月的平均值。我想在我的数组中每年的每个月都这样做。我认为目前没有一种简单的方法可以用 xarray 做到这一点,但我很感激人们能找到任何解决方法!:)
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

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


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

result = da.groupby("year_month") - da.groupby("year_month").mean("time")


查看完整回答
反对 回复 2022-10-18
?
ITMISS

TA贡献1871条经验 获得超8个赞

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


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')

我已经对此进行了数字测试,它给出了正确的答案,但目前它不是很灵活,我希望这也能扩展到“局部季节性异常”。


查看完整回答
反对 回复 2022-10-18
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信