我正在使用20世纪的再分析平均海平面气压数据(CIRES),而我正试图制作飓风桑迪的情节。 (我使用过matlab,但是对于类我必须使用Python并且似乎缺少元素)
到目前为止,我的代码是: import netCDF4 as nc
import numpy as np
import matplotlib.pylab as plt
import datetime as dt
from mpl_toolkits.basemap import Basemap
def read_var(ncfile, varname):
fid= nc.Dataset(ncfile, 'r')
out = fid.variables[varname][:]
fid.close()
return out
psl = read_var('prmsl.2012.nc', 'prmsl')
lat = read_var('prmsl.2012.nc', 'lat')
lon = read_var('prmsl.2012.nc', 'lon')
def prmsltime_from_datetime(wanted_dt):
time0 = dt.datetime(1800, 01, 01)
prmsltime = (wanted_dt - time0).days*24
return prmsltime
date_i_want = dt.datetime(2012, 10, 28, 0)
print prmsltime_from_datetime(date_i_want)
avg = np.min(psl[1204:1208,34:19,28:41], axis=0)
print avg
lat1= lat[np.where(lat >= 24)]
mylat= lat1[np.where(lat1 <= 52)]
lon1 = lon[np.where(lon >= 54)]
mylon= 360 - lon1[np.where(lon1 <= 86)]
lons, lats = np.meshgrid(mylon,mylat)
m = Basemap(projection='cyl',llcrnrlat=24,urcrnrlat=52,llcrnrlon=274,urcrnrlon=306,resolution='c')
plt.figure()
x,y=m(lons,lats)
plt.contourf(x,y, avg)
m.drawcoastlines()
m.colorbar()
plt.xlabel('Latitude')
plt.ylabel('Longitude')
plt.title('SLP on October 28, 2012')
plt.show()
然而,当我打印时间时,我得到了数百万的答案,所以我认为这搞砸了我的数据绘图,因为当我绘制10月28日没有出现像飓风这样的东西时。任何帮助都很受欢迎!!!
答案 0 :(得分:0)
你几乎得到了它,但不是那么......
你必须弄清楚要使用的指数。
要使用prmsltime_from_datetime()
获取2012-10-28 0000hrs UTC的时间,请在time
数组中查找索引:
time = read_var('prmsl.2012.nc', 'time')
date_i_want = dt.datetime(2012, 10, 28, 0)
t = prmsltime_from_datetime(date_i_want)
t_idx = np.where(time == t)[0][0]
还有数据:
lat_top = np.where(lat <= 52)[0][0]
lat_bottom = np.where(lat >= 24)[0][-1]
lats = lat[lat_top:lat_bottom]
lon_left = np.where(lon >= 274)[0][0]
lon_right = np.where(lon <= 306)[0][-1]
lons = lon[lon_left:lon_right]
然后,您可以使用这些合作伙伴定义地图边界。
m = Basemap(projection='cyl',
llcrnrlat=lats[-1], urcrnrlat=lats[0],
llcrnrlon=lons[0], urcrnrlon=lons[-1],
resolution='c')
获取数据,为x和y点创建一个网格,最后绘制它。
# convert to mb
data = 0.01*psl[t_idx, lat_top:lat_bottom, lon_left:lon_right]
x, y = m(*np.meshgrid(lons, lats))
plt.contourf(x, y, data)
注意:数据以帕斯卡为单位,因此您应将其转换为hPa / mb(0.01
的次数)。
这给出了以下情节:
以下是所有修改完整性的代码:
#!/usr/bin/env python
import netCDF4 as nc
import numpy as np
import matplotlib.pylab as plt
import datetime as dt
from mpl_toolkits.basemap import Basemap
def read_var(ncfile, varname):
fid= nc.Dataset(ncfile, 'r')
out = fid.variables[varname][:]
fid.close()
return out
def prmsltime_from_datetime(wanted_dt):
time0 = dt.datetime(1800, 01, 01, 0)
prmsltime = (wanted_dt - time0).days*24
return prmsltime
psl = read_var('prmsl.2012.nc', 'prmsl')
lat = read_var('prmsl.2012.nc', 'lat')
lon = read_var('prmsl.2012.nc', 'lon')
time = read_var('prmsl.2012.nc', 'time')
date_i_want = dt.datetime(2012, 10, 28, 0)
t = prmsltime_from_datetime(date_i_want)
t_idx = np.where(time == t)[0][0]
lat_top = np.where(lat <= 52)[0][0]
lat_bottom = np.where(lat >= 24)[0][-1]
lats = lat[lat_top:lat_bottom]
lon_left = np.where(lon >= 274)[0][0]
lon_right = np.where(lon <= 306)[0][-1]
lons = lon[lon_left:lon_right]
m = Basemap(projection='cyl',
llcrnrlat=lats[-1], urcrnrlat=lats[0],
llcrnrlon=lons[0], urcrnrlon=lons[-1],
resolution='c')
plt.figure()
# convert to mb
data = 0.01*psl[t_idx, lat_top:lat_bottom, lon_left:lon_right]
x,y = m(*np.meshgrid(lons, lats))
plt.contourf(x, y, data)
m.drawcoastlines()
m.colorbar()
plt.xlabel('Latitude')
plt.ylabel('Longitude')
plt.title('SLP on October 28, 2012')
plt.show()