【发布时间】:2014-04-12 18:45:07
【问题描述】:
我在阅读多个 netCDF 文件时需要帮助,尽管这里的示例很少,但它们都不能正常工作。 我正在使用 Python(x,y) 版本 2.7.5 和其他软件包:netcdf4 1.0.7-4、matplotlib 1.3.1-4、numpy 1.8、pandas 0.12、 底图 1.0.2...
我习惯用 GrADS 做的事情很少,我需要开始用 Python 做这些事情。 我有一些 2 米温度数据(每年 4 小时数据,来自 ECMWF),每个文件包含 2 米温度数据,Xsize=480,Ysize=241, Zsize(level)=1, Tsize(time) = 1460 或 1464 闰年。 这些是我的文件名看起来很像:t2m.1981.nc、t2m.1982.nc、t2m.1983.nc ...等。
基于此页面: (Loop through netcdf files and run calculations - Python or R) 这是我现在的位置:
from pylab import *
import netCDF4 as nc
from netCDF4 import *
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
f = nc.MFDataset('d:/data/ecmwf/t2m.????.nc') # as '????' being the years
t2mtr = f.variables['t2m']
ntimes, ny, nx = shape(t2mtr)
temp2m = zeros((ny,nx),dtype=float64)
print ntimes
for i in xrange(ntimes):
temp2m += t2mtr[i,:,:] #I'm not sure how to slice this, just wanted to get the 00Z values.
# is it possible to assign to a new array,...
#... (for eg.) the average values of 00z for January only from 1981-2000?
#creating a NetCDF file
nco = nc.Dataset('d:/data/ecmwf/t2m.00zJan.nc','w',clobber=True)
nco.createDimension('x',nx)
nco.createDimension('y',ny)
temp2m_v = nco.createVariable('t2m', 'i4', ( 'y', 'x'))
temp2m_v.units='Kelvin'
temp2m_v.long_name='2 meter Temperature'
temp2m_v.grid_mapping = 'Lambert_Conformal' # can it be something else or ..
#... eliminated?).This is straight from the solution on that webpage.
lono = nco.createVariable('longitude','f8')
lato = nco.createVariable('latitude','f8')
xo = nco.createVariable('x','f4',('x')) #not sure if this is important
yo = nco.createVariable('y','f4',('y')) #not sure if this is important
lco = nco.createVariable('Lambert_Conformal','i4') #not sure
#copy all the variable attributes from original file
for var in ['longitude','latitude']:
for att in f.variables[var].ncattrs():
setattr(nco.variables[var],att,getattr(f.variables[var],att))
# copy variable data for lon,lat,x and y
lono=f.variables['longitude'][:]
lato=f.variables['latitude'][:]
#xo[:]=f.variables['x']
#yo[:]=f.variables['y']
# write the temp at 2 m data
temp2m_v[:,:]=temp2m
# copy Global attributes from original file
for att in f.ncattrs():
setattr(nco,att,getattr(f,att))
nco.Conventions='CF-1.6' #not sure what is this.
nco.close()
#attempt to plot the 00zJan mean
file=nc.Dataset('d:/data/ecmwf/t2m.00zJan.nc','r')
t2mtr=file.variables['t2m'][:]
lon=file.variables['longitude'][:]
lat=file.variables['latitude'][:]
clevs=np.arange(0,500.,10.)
map = Basemap(projection='cyl',llcrnrlat=0.,urcrnrlat=10.,llcrnrlon=97.,urcrnrlon=110.,resolution='i')
x,y=map(*np.meshgrid(lon,lat))
cs = map.contourf(x,y,t2mtr,clevs,extend='both')
map.drawcoastlines()
map.drawcountries()
plt.plot(cs)
plt.show()
第一个问题是 temp2m += t2mtr[1,:,:] 。我不确定如何对数据进行切片以仅获取所有文件的 00z(仅假设 1 月)。
其次,在运行测试时,cs = map.contourf(x,y,t2mtr,clevs,extend='both') 出现错误,提示“形状与 z 的形状不匹配:找到 (1,1) 而不是 (241,480)”。由于记录值的错误,我知道输出数据可能存在一些错误,但我不知道是什么/在哪里。
感谢您的宝贵时间。我希望这不会令人困惑。
【问题讨论】:
-
00Z数据是什么意思?我不明白您的数据集采用什么格式:3D,形状 = (time, x, y) 我所理解的。 Z在哪里/是什么?
-
每个文件包含 00z,06z,12z 和 18z(时间,UTC)。这是每日数据的 4 倍。因此,假设在文件 t2m.2000.nc, t=1464 中,一年每天 4 次。由于数据在地表上(2 米温度),Z 值 = 1。这是一个全局网格数据。
标签: python numpy matplotlib netcdf