python - 在 python 中计算 netcdf 文件几年的年度异常

标签 python python-2.7 netcdf

我需要计算netcdf 44年每月文件的气温月度、季节和年度异常情况,使用一些函数可以自动获取该期间的月度、季节和年度异常情况并将结果保存在文件夹中。我只知道如何使用一年而不是几年的功能。

from netCDF4 import Dataset, num2date
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeat
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from mpl_toolkits.basemap import Basemap

ds = Dataset('./interim_t2m_19792017.nc')
lats = ds.variables['latitude'][:]  # extract/copy the data
lons = ds.variables['longitude'][:]
time = ds.variables['time']
var = ds.variables['t2m'] 

lon, lat = np.meshgrid(lons, lats)
dates = num2date(time[:], time.units)
dates_pd = pd.to_datetime(dates)
periods = dates_pd.to_period(freq='M')

def plt_map(data):
    m = Basemap(projection='mill',llcrnrlat=-80,urcrnrlat=80,\
            llcrnrlon=0,urcrnrlon=360,lat_ts=20,resolution='c')
    x, y = m(lon, lat)
    plt.figure(figsize=(10,7))
    m.drawcoastlines()
    m.drawparallels(np.arange(-80.,81.,20.))
    m.drawmeridians(np.arange(-180.,181.,20.))
    m.drawmapboundary(fill_color='white')
    m.contourf(x,y,data, extend="both",cmap="jet");
    plt.colorbar(orientation='horizontal', pad=0.05)
plt_map(var[0,:,:])

mask_2016 = periods.year==2016
data = var[mask_2016,:,:].mean(axis=0)
plt_map(data)

最佳答案

我知道您正在寻找 python 答案,但这是 CDO(气候数据运算符)的面包和黄油,它允许您从终端窗口通过一两个命令进行此类计算。

例如,要获取 Era Interim 数据的年均值,您可以执行以下操作

cdo yearmean interim_t2m_19792017.nc erai_yearmean.nc

然后要计算年度异常,您需要计算长期平均值并减去它

cdo timmean interim_t2m_19792017.nc erai_timemean.nc
cdo sub erai_yearmean.nc erai_timemean.nc yearanom.nc

您可以使用“管道”组合以上所有这 3 个命令,但我在这里将它们分开,因为更容易看到发生了什么。

您可以通过以下方式获得平均每月季节性周期:

cdo ymonmean interim_t2m_19792017.nc erai_ymonmean.nc

这将为您提供一个包含所有 1 月、2 月等(12 个时间片)的平均值的文件。然后您可以计算每月异常情况,每个异常情况都相对于其自己的每月平均值

cdo monmean interim_t2m_19792017.nc erai_monmean.nc
cdo sub erai_monmean.nc erai_ymonmean.nc erai_monanom.nc

还有季节性平均值的函数。

有关更多详细信息,请参阅在线文档:https://code.mpimet.mpg.de/projects/cdo/

最后,msi_gerva 在评论中是正确的,问题中不清楚异常是什么,因为您还可以计算相对于年度或长期平均值的每月异常。此外,您要求年度异常并说您只知道如何执行一年,但我认为这没有多大意义,因为异常将为零。更准确地澄清问题可能会有所帮助。

关于python - 在 python 中计算 netcdf 文件几年的年度异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52462472/

相关文章:

javascript - Python:更新通过浏览器中的 JavaScript 调用创建的 html 时出现问题

python - 在另一个函数 python 中使用一个函数的列表

python - PyCharm 解析 - flask.ext.sqlalchemy 与 flask_sqlalchemy

python-2.7 在对象导入时执行代码

java - Geoserver - 栅格/wms 图层多个点/位置或边界框的 GetFeatureInfo

netcdf - 我应该如何使用 CDO selyear?我得到一个四倍大的输出文件

切换到linux时python pygame程序无法正常工作

python - 带有 arcLength 的 Python 错误的 OpenCV

Python:Pandas - 根据列值分隔数据框

python - Xarray 更改时间变量中的单位