Reading NetCDF climate grids in python
Step 1: Acquire Data
The data set I'll be using for this article is an extraction of climate model projections for Minnesota from TODO's TODO. Since (presumably) these conform to other standard climate model outputs, you should feel free to find our own data. Regardless, the same techniques will apply.
Step 2: Acquire Tools
We're going to use SciPy.
sudo apt-get install python-scipy
Step 3: Open The Data
Change into the directory containing your data and boot up Python.
from scipy.io import netcdf
import sys
filename='Extraction_tas.nc'
f=netcdf.netcdf_file(filename,'r')
SciPy contains a handy module for reading NetCDF files.
What can we do with the f
object?
>>> f.variables
{'latitude': <scipy.io.netcdf.netcdf_variable object at 0x1fe3610>, 'time': <scipy.io.netcdf.netcdf_variable object at 0x1fe3750>, 'longitude': <scipy.io.netcdf.netcdf_variable object at 0x1fe3650>, 'tas': <scipy.io.netcdf.netcdf_variable object at 0x1fe36d0>}
>>> f.dimensions
{'latitude': 52, 'projection': None, 'longitude': 65, 'time': 1800}
>>> f.variables['time']
<scipy.io.netcdf.netcdf_variable object at 0x1fe3750>
>>> f.variables['time'].units
'days since 1950-01-01 00:00:00'
>>> f.variables['time'].dimensions
('time',)
>>> f.variables['longitude']
<scipy.io.netcdf.netcdf_variable object at 0x1fe3650>
>>> f.variables['longitude'].units
'degrees_east'
>>> f.variables['longitude'].dimensions
('longitude',)
>>> f.variables['longitude'].shape
(65,)
>>> f.variables['tas']
<scipy.io.netcdf.netcdf_variable object at 0x1fe36d0>
>>> f.variables['tas'].units
'C'
>>> f.variables['tas'].dimensions
('projection', 'time', 'latitude', 'longitude')
>>> f.variables['tas'].shape
(20, 1800, 52, 65)
Step 4: Display Data
Given that the tas
variable has a shape of (Projection, Time, Latitude,
Longitude), a straight-forward strategy to display using a contour plot
would be:
import pylab as pl
pl.contourf(f.variables['tas'][0,25,:,:])
pl.show()
where [0,25,:,:]
represents Projection 0, Timestep 25, and all of the
longitude/latitude data.
Alternatively, we can plot it as a heat map:
pl.pcolor(f.variables['tas'][0,783,:,:])
pl.colorbar()
pl.show()