在python中绘制CIRES数据

时间:2014-05-04 23:20:55

标签: python netcdf

我正在使用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日没有出现像飓风这样的东西时。任何帮助都很受欢迎!!!

1 个答案:

答案 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的次数)。

这给出了以下情节: Sandy 2012102800


以下是所有修改完整性的代码:

#!/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()