微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算和绘制月平均 SST 异常并使用 xarray multindex 绘制pangeo 教程库

如何解决计算和绘制月平均 SST 异常并使用 xarray multindex 绘制pangeo 教程库

我正在浏览 pangeo 教程库并被困在 ENSO exercise at the end of xarray

您需要下载一些文件

%%bash
git clone https://github.com/pangeo-data/tutorial-data.git

那么:

import numpy as np
import xarray as xr
import pandas as pd

# load all files
ds_all = xr.open_mfdataset('./tutorial-data/sst/*nc',combine='by_coords')
# slice for enso3.4 region
sst_enso = ds_all.sel(lat=slice(-5,5),lon=slice(-170+360,-120+360))
# subset years to match hint at the bottom
sst_enso = sst_enso.sel(time=sst_enso.time.dt.year>=1982)
# groupby each timepoint and find mean for entire spatial region
avg_enso = sst_enso.sst.groupby('time').mean(dim=['lat','lon'])
avg_enso.plot()

average temperature for enso3.4 region

此图与教程底部显示的图相匹配。到目前为止一切顺利,但我也想计算和绘制 ONI。海洋尼诺指数的暖期或冷期由 Niño 3.4 区域高于(低于)阈值 +0.5°C (-0.5° C)。这被称为海洋尼诺指数 (ONI)。

我遇到了麻烦,因为 month 变成了索引。 第一季度。我不确定如何确保减去 sst_enso - enso_clim 得出正确的数学结果。 假设这是正确的,我可以再次计算区域均值异常,然后使用滚动窗口均值。

enso_clim = sst_enso.sst.groupby('time.month').mean('time')
sst_anom = sst_enso - enso_clim
enso_anom = sst_anom.groupby('time').mean(dim=['lat','lon'])
oni = enso_anom.rolling(time = 3).mean()

现在我想用正红色,负蓝色绘制一个 oni 的条形图。像这样的东西:

example red/blue bar graph

例如:

oni.sst.plot.bar(color=(oni.sst < 0).map({True: 'b',False: 'r'}))

相反,oni.sst.plot() 给了我:

month x year oni

重置索引 enso_anom.reset_index('month',drop=True).sst 仍然保留 month 作为维度并给出相同的图。如果您 drop_dims('month'),那么 sst 数据就会消失。

我也尝试使用 oni.to_dataframe() 转换为 pd,但最终得到 5040 行,即我为子集划分的 12 个月 x 420 个月-年。根据 docs “DataFrame 由索引坐标的笛卡尔积(以 pandas.MultiIndex 的形式)进行索引。”所以我想这是有道理的,但没有用。即使您在转换为数据帧之前 reset_index 的 oni 也会得到相同的 5040 行。 第 2 季度。由于数据框必须自己重复,我可能可以弄清楚在哪里,但是有没有办法做到这一点“更干净”,每个日期在所有 12 个月内都不重复?

解决方法

由于 重新分块。这就是你以这样的情节收场的原因。

有一个技巧(发现 here)来计算异常。除此之外,我会选择 1986-2015 年作为参考期(见 NOAA definition for ONI-index)。

将两者结合起来,我得到了这个简短的代码(没有条形图):

import xarray as xr
import pandas as pd
import matplotlib.pyplot as plt


# load all files
ds_all = xr.open_mfdataset('./tutorial-data/sst/*nc',combine='by_coords')
# slice for enso3.4 region
sst_enso = ds_all.sel(lat=slice(-5,5),lon=slice(-170+360,-120+360))
avg_enso = sst_enso.sst.groupby('time').mean(dim=['lat','lon'])
avg_enso.plot()

ds = sst_enso.sst.mean(dim=['lat','lon'])
enso_clim = ds.sel(time=slice('1986-01-01','2016-01-01')).groupby("time.month").mean("time")
# ref: https://origin.cpc.ncep.noaa.gov/products/analysis_monitoring/ensostuff/ONI_change.shtml
enso_anom = ds.groupby("time.month") - enso_clim
# ref: http://xarray.pydata.org/en/stable/examples/weather-data.html#Calculate-monthly-anomalies

enso_anom.plot()

oni = enso_anom.rolling(time = 3).mean()
oni.plot()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。