[英]Calculate variables mean in a selective area , in gridded netCDF file
[英]Obtain mean value of specific area in netCDF
我正在尝试 plot 来自 a.nc 文件的特定区域的海面温度 (SST) 时间序列。 SST 是一个三维变量(纬度、经度、时间),它具有从 1982 年到 2016 年特定区域的日均值。我希望我的 plot 反映整个时间段的季节性 sst 变化。 我假设我首先需要做的是为我的 lat,lon 区域在我可以改变的每一天获得一个平均 sst 值。 到目前为止,我假设我需要读取 .nc 文件和变量:
import netCDF4 as nc
f = nc.Dataset('cmems_SST_MED_SST_L4_REP_OBSERVATIONS_010_021_1639073212518.nc')
sst = f.variables['analysed_sst'][:]
lon = f.variables['longitude'][:]
lat = f.variables['latitude'][:]
接下来,按照此处建议的代码,我尝试重塑并获得平均值,但弹出错误:
global_average= np.nanmean(sst[:,:,:],axis=(1,2))
annual_temp = np.nanmean(np.reshape(global_average, (34,12)), axis = 1)
#34 years between 1982 and 2016, and 12 months per year.
错误无法将大小为 14008 的数组重新整形为形状 (34,12)
从这里我发现了不同的方法,比如使用 cdo 或 nco (由于安装问题而无法使用)等,它们不适合我的情况。 我使用了 nanmean,因为知道在 MATLAB 中,这是使用 nanmean function 完成的。 我对这个话题很陌生,我想请教一些提示,比如,我应该在哪里更多地关注或者什么路径更适合这种情况。 谢谢!!
仅使用纯 python 处理日常数据很困难,因为您应该考虑闰年和子设置区域需要繁琐的索引跨步......
正如 steTATO 所提到的,由于您正在处理的数据具有每日时间分辨率,因此您需要考虑以下几点
您需要根据年份 (1984,1988,1992,1996,2000,2004,2008,2012,2016) 将global_average
重塑为 (34,365) 或 (34,366)。 所以你上面的代码应该看起来像
annual_temp = np.nanmean(np.reshape(global_average, (34,365)), axis = 1)
但是,就像我说的那样,由于闰年,你不能通过简单地重塑global_average
来做你想做的事情。
如果我别无选择,只能使用 python,我会执行以下操作
import numpy as np
def days_in_year(in_year):
leap_years = [1984,1988,1992,1996,2000,2004,2008,2012,2016]
if (in_year in leap_years):
out_days = 366
else:
out_days = 365
return out_days
# some of your code, importing netcdf data
year = np.arange(1982,2017)
global_avg= np.nanmean(sst[:,:,:],axis=(1,2))
annual_avgs = []
i = 0
for yr in range(35):
i = i + days_in_year(year[yr])
f = i - days_in_year(year[yr])
annual_avg = np.nanmean(global_avg[i:f])
annual_avgs.append(annual_avg)
上面的代码基本上通过考虑闰年的global_avg
的步幅来取平均值,并将其保存为annual_avgs
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.