Quick Start

This section provides a quick overview of how to work with PseudoNetCDF. Each quick example is cumulative. If you don’t understand something, look at the previous sections.

Import PseudoNetCDF

First, PseudoNetCDF should be imported as pnc for brevity.

import PseudoNetCDF as pnc

Open a File

pncopen() helps PseudoNetCDF open many types of files, but is most well tested with Air Quality related files including models (e.g., CAMx, CMAQ, GEOS-Chem) and observations (e.g., woudc sondes, AQS, aircraft icartt). These examples are from publicly available data.

# from CAMx Test Case v6
camxpath1 = 'CAMx.v6.40.midwest.36.12.noMPI.20020603.avrg.grd02'
camxf = pnc.pncopen(camxpath1, format='uamiv')
# from CMAQ Test Case v5.2
cmaqpath1 = 'CCTM_ACONC_v52_cb6r3_intel17.0_SE52BENCH_20110701.nc'
cmaqf = pnc.pncopen(cmaqpath1, format='ioapi')
# from the GEOS-Chem benchmark v12
gcpath1 = 'ctm.bpch'
gcf = pnc.pncopen(gcpath1, format='bpch')
# from the INTEX-NA NASA campaign
ictpath = 'HOX_DC8_20040626_R0.ict'
ictf = pnc.pncopen(ictpath, format='ffi1001')
# from the woudc.org
woudcpath = 'bu20170609.b18.csv'
wdcf = pnc.pncopen(woudcpath, format='woudcsonde')

Don’t know the format of your file… leave out the format keyword and PseudoNetCDF will try to figure it out for you.

Get Help

Most objects have are documented, so use help if you want to know more. For example, if you wanted to learn more about opening a file pnc.pncopen(), use :func:help

help(pnc.pncopen)

Subset on Dimension

sliceDimensions() is one of the most basic jobs of PNC. The sliceDimensions method will extract just the selected elements on one or more dimensions (e.g., LAY). This method works with slice objects, integers, and arrays.

lay1f = camxf.sliceDimensions(LAY=0)

Apply Function on a Dimension

applyAlongDimensions() applies functions on dimensions and is the second most basic jobs of PNC. Functions can be numpy array method names (e.g., ‘mean’, ‘std’, ‘sum’) or any function.

timeavgf = camxf.applyAlongDimensions(TSTEP='mean')

Make a plot

The plot() interface tries to make some simple plotting easy. It also allows keyword configuration and object-based interaction with the created plot by returning the axes that was plotted on.

ax = lay1f.plot('O3')
ax.figure.savefig('O3.png')

Derive Variables

The eval() is very like pandas.DataFrame.eval. It requires the non-derived variables to be in the file or calculated earlier in a multi-line script.

noxf = lay1f.eval('NOx = NO + NO2')

Stack Files on Dimensions

The stack() method allows files to be concatenated on a dimension. All other dimensions must be of the same length.

camxpath1 = 'CAMx.v6.40.midwest.36.12.noMPI.20020603.avrg.grd02'
camxpath2 = 'CAMx.v6.40.midwest.36.12.noMPI.20020604.avrg.grd02'
camx1f = pnc.pncopen(camxpath1, format='uamiv')
camx2f = pnc.pncopen(camxpath2, format='uamiv')
camxf = camx1f.stack(camx2f, 'TSTEP')

Extract Coordinates

The ll2ij() converts longitude and latitude to indices (0-based) and the time2t() function converts datetime objects to time indices (0-based). This makes it easy to extract time and space elements from a file. Currently, there is not a comparable vertical method.

from datetime import datetime

obslon = [-100, -90]
obslat = [30, 40]
obsdatstrs = [
  datetime(2002, 6, 3, 8, tzinfo=timezone.utc),
  datetime(2002, 6, 3, 9, tzinfo=timezone.utc),
]

i, j = camxf.ll2ij(obslon, obslat)
k = i * 0
t = camxf.time2t(obstimes)

atobsf = camxf.sliceDimensions(TSTEP=t, LAY=k, ROW=j, COL=i)

Copy a File to Memory

Finally, it is often nice to make an in-memory copy of a file. Sometimes it can be as a template or other times it helps methods work more efficiently.

inmemf = camxf.copy()