Recipe: Python program to read data from downloaded file
Problem
We want to read a downloaded data file using Python.
Solution
For the purpose of this example, we assume that we have already downloaded the file c1440_NR.inst01hr_3d_T_Cv.20060918_0900z.nc4
from the ftp server. For more information about file naming conventions, and how to download a file from the ftp server, please follow the links in the #See Also section.
Code (using netcdf4-python
)
Here we use the netcdf4-python
package to read the data file. If the command
> python -c "import netCDF4"
does not return any error, we have the package installed.
The code below reads the global temperature data from file, computes the maximum and minimum temperatures and plots (using the matplotlib
package) the surface temperature (level=71).
#!/usr/bin/env python
import sys
import numpy as np
import netCDF4 as nc4
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
rootgrp = nc4.Dataset('c1440_NR.inst01hr_3d_T_Cv.20060918_0900z.nc4', 'r')
print "rootgrp.variables['T'].shape", rootgrp.variables['T'].shape
# read global air temperature for all levels
print 'Reading T...',; sys.stdout.flush()
T = rootgrp.variables['T'][0,:,:,:]
print 'done.'; sys.stdout.flush()
print 'T.shape:', T.shape
# min/max
print 'min(T): %.4f' % np.min(T)
print 'max(T): %.4f' % np.max(T)
# set up cylindrical map
m = Basemap(
projection='cyl',
llcrnrlat=-90, urcrnrlat=90,
llcrnrlon=-180, urcrnrlon=180,
resolution='c'
)
m.drawcoastlines(linewidth=0.5)
m.drawmapboundary()
# plot contour
level = 71 # surface
X = np.arange(-180.0, 180.0, .5)
Y = np.arange(-90.0, 90.1, .5) # 90 is the last element
cp = plt.contour(X, Y, T[level,:,:], 20, zorder=2)
plt.clabel(cp, inline=1, fontsize=9)
plt.title('Air temperature at the surface')
plt.show()
Output
Running this python script, we get the text output
rootgrp.variables['T'].shape (1, 72, 361, 720) Reading T... done. T.shape: (72, 361, 720) min(T): 180.3667 max(T): 315.6512
and the plot
Discussions
Modifications to read a subset of the data
The above python code can be easily modified to read a subset of the data instead. For example, to read temperature data inside the box bounded by latitudes 25oN, 50oN and longitudes -130oN, -65oN, we will replace line 15 in the code above by
T = rootgrp.variables['T'][0,:,229:280,99:230]
The conversion of lat/lon co-ordinates to indices is left as an exercise for the user.
Running the modified script, produces the text output
rootgrp.variables['T'].shape (1, 72, 361, 720) Reading T... done. T.shape: (72, 51, 131) min(T): 191.6956 max(T): 305.6048