#! /usr/bin/env python ############################################################################### # File name: convert_timeseries.py # # # # Author : Zhengtao Cui (Zhengtao.Cui@noaa.gov) # # # # Initial version date: # # # # Last modification date: 5/30/2019 # # # # Description: The driver to create NetCDF time series files from Army Crops # # of Engineers real-time observations # # # ############################################################################### import os, sys, time, urllib, getopt, re import logging import glob from string import * import xml.etree.ElementTree as etree from datetime import datetime, timedelta from PI_XML import PI_XML from RFC_Forecast import RFC_Forecast from RFCTimeSeries import RFCTimeSeries from RFCHelper import RFCHelper from RFC_Sites import RFC_Sites #import Tracer """ The driver to parse downloaded ACE XML observations and create time series and write to NetCDF files Author: Zhengtao Cui (Zhengtao.Cui@noaa.gov) Date: May 30, 2019 """ def main(argv): """ function to get input arguments """ inputdir = '' try: opts, args = getopt.getopt(argv,"hi:o:s:",["idir=", "odir=", \ "sites="]) except getopt.GetoptError: print('convert_timeseries.py -i -o -s ') sys.exit(2) for opt, arg in opts: if opt == '-h': print( \ 'make_time_series_from_pi_xml.py -i -o -s ') sys.exit() elif opt in ('-i', "--idir"): inputdir = arg if not os.path.exists( inputdir ): raise RuntimeError( 'FATAL Error: inputdir ' + \ inputdir + ' does not exist!' ) elif opt in ('-o', "--odir" ): outputdir = arg if not os.path.exists( outputdir ): raise RuntimeError( 'FATAL Error: outputdir ' + \ outputdir + ' does not exist!' ) elif opt in ('-s', "--rfcsitefile" ): sitefile = arg if not os.path.exists( sitefile ): raise RuntimeError( 'FATAL Error: sitefile ' + \ sitefile + ' does not exist!' ) return (inputdir, outputdir, sitefile) t0 = time.time() logging.basicConfig(format=\ '%(asctime)s - %(name)s - %(levelname)s - %(message)s',\ level=logging.INFO) logger = logging.getLogger(__name__) formatter = logging.Formatter(\ '%(asctime)s - %(name)s - %(levelname)s - %(message)s') #logger.setFormatter(formatter) logger.info( "System Path: " + str( sys.path ) ) if __name__ == "__main__": try: odir = main(sys.argv[1:]) except Exception as e: logger.error("Failed to get program options.", exc_info=True) indir = odir[0] outdir = odir[1] rfcsitefile = odir[2] logger.info( 'Input dir is "' + indir + '"') logger.info( 'Output dir is "' + outdir + '"') logger.info( 'RFC site file is "' + rfcsitefile + '"') # # Load ACE observed XML discharge data # try: fcsts = [] if not os.path.isdir( indir ): raise SystemExit( "FATAL ERROR: " + indir + \ " is not a directory or does not exist. ") rfcsites = RFC_Sites( rfcsitefile ) for file in glob.glob( indir + '/*.ncdf' ): try: id = os.path.basename( file )[20:25] # if rfcsites.getRFCBySite( id ) == 'OHRFC': if id == 'MGCO2': print( file ) # print(id, 'OHRFC' ) logger.info( 'Reading ' + file + ' ... ' ) series = RFCTimeSeries.fromNetCDF( file ) print( series.issueTimeStamps ) print( series.startTimeStamp ) new_its = [] for its in series.issueTimeStamps: new_its.append( its - timedelta( days = 6 ) ) print( new_its ) series.issueTimeStamps = new_its print( series.issueTimeStamps ) series.startTimeStamp = series.startTimeStamp - timedelta( days = 6 ) series.toNetCDF( outdir ) except Exception as e: logger.warn( repr( e ), exc_info=True ) continue except Exception as e: logger.error("Failed to load time series files.", exc_info=True) logger.info( "Program finished in: " + \ "{0:.1f}".format( (time.time() - t0) / 60.0 ) + \ " minutes" )