Source code for PseudoNetCDF.cmaqfiles._cmaqomidat

from __future__ import print_function
from ..core._files import PseudoNetCDFFile
import numpy as np
from datetime import datetime, timedelta


[docs] class cmaqomidat(PseudoNetCDFFile): def __init__(self, path): """ Arguments --------- path : str path to CMAQ-ready OMI file. This is the output of create_omi preprocessor. See notes for general form. Notes ----- File has the genearl form nlat 17 nlon 17 yeardate latitude 180Z 157.5W ... 1990.203 80 426 415 ... ... 1990.203 -80 260 253 ... """ import pandas as pd tmpf = open(path, 'r') key1, val1 = tmpf.readline().split() key2, val2 = tmpf.readline().split() if key1.strip() == 'nlat': nlat = eval(val1) nlon = eval(val2) if key1.strip() == 'nlon': nlon = eval(val1) nlat = eval(val2) self._df = df = pd.read_csv(path, delimiter=r'\s+', skiprows=2) latitudes = df.latitude.values.reshape(-1, nlat) if not (latitudes[0] == latitudes[:]).all(): raise ValueError('latitudes should all be in the same order') # Latitudes are reordered from top-bottom to bottom-top data = self._df.drop( columns=['yeardate', 'latitude'] ).values.reshape(-1, nlat, nlon)[:, ::-1] ntime = data.shape[0] # Latitudes are reordered from top-bottom to bottom-top latc = latitudes[0, ::-1] dlat = np.abs(np.diff(latc)).mean() / 2 latb = np.array([latc - dlat, latc + dlat]).T lonc = np.linspace(-180, 180, nlon) dlon = np.abs(np.diff(lonc)).mean() / 2 lonb = np.array([lonc - dlon, lonc + dlon]).T self.createDimension('time', ntime) self.createDimension('latitude', nlat) self.createDimension('longitude', nlon) self.createDimension('nv', 2) fltyears = np.sort(df.yeardate.unique()) rdate = datetime(1970, 1, 1) dts = [] for fltyear in fltyears: year, fyear = divmod(fltyear, 1) year = int(year) nextyear = datetime(year + 1, 1, 1) thisyear = datetime(year, 1, 1) ndays = (nextyear - thisyear).total_seconds() / 3600. / 24. date = thisyear + timedelta(days=ndays * fyear) dt = (date - rdate).total_seconds() / 3600. / 24. dts.append(dt) dts = np.array(dts) self.createVariable( 'year', 'd', ('time',), units='fractional year' )[:] = fltyears self.createVariable( 'time', 'd', ('time',), units='days since 1970-01-01 00:00:00+0000', values=dts ) self.createVariable( 'latitude', 'd', ('latitude',), units='degrees_north', values=latc ) self.createVariable( 'latitude_bounds', 'd', ('latitude', 'nv'), units='degrees_north', values=latb ) self.createVariable( 'longitude', 'd', ('latitude',), units='degrees_east', values=lonc ) self.createVariable( 'longitude_bounds', 'd', ('latitude', 'nv'), units='degrees_east', values=lonb ) v = self.createVariable( 'O3', 'd', ('time', 'latitude', 'longitude'), missing_value=-1, units='DU' ) v[:] = data self.setCoords([ 'time', 'latitude', 'longitude', 'latitude_bounds', 'longitude_bounds' ])