U g&@sddlZddlZddlZddlZddlZddlZddlTddlmZddl m Z m Z m Z ddl Z ddlZddlZddlmmZddlmZddlmZddlmZdd ZGd d d eZdS) N)*) OrderedDict)datetime timedeltatimezone) TimeSlice) Observation) CWMS_SitescCstd}||d}tt|dt|ddt|ddt|dt|d t|d d }|d d kr~|d9}|S)Nz(?P-?)P(?:(?P\d+)Y)?(?:(?P\d+)M)?(?:(?P\d+)D)?(?:T(?:(?P\d+)H)?(?:(?P\d+)M)?(?:(?P\d+)S)?)?rdaysmonthsyearsimhoursminutesseconds)r rrrsign-)recompilematch groupdictrint)periodZregexZdurationdeltarR/lfs/h1/ops/prod/packages/nwm.v3.0.13/ush/ace_download/analysis/ACE_Observation.py parseDurations      rc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)ACE_Observationz) Store one USACE data cCsP||_t|_||_|dr*||n"|dr@||n td|dS)zd Initialize the ACE_Observation object with a given filename z.jsonz.xmlzFATAL ERROR: Unknow file type: N)sourcertimeValueQuality_sitesendswith loadCwmsjson loadCWMSxml RuntimeError)selfZcwmsxmljsonfilenameZ cwmssitesrrr__init__5s    zACE_Observation.__init__c stz$t|}t|}|d}|d}|d|_|d||_|j|||_t|d}t |D]j}|d|}t|dkrb| |d} t j | tjjdd} t|d |t|d f|j| <qbt|jdt|jd f|_|ttfd d t|j|_d|_WnHtk rn} z(tdt| d|d|dW5d} ~ XYnXdS)z Read real-time discharge data from a given CWMS JSON file Input: jsonfilename - the CWMS json filename namez office-idunits.valuesrNtzinforcs$|d|dd|ddffSNrr.rkvunitConvertToM3perSecrrqs z.ACE_Observation.loadCwmsjson..m3/szWARNING: parsing JSON error: : z). Or Maybe "values" field are empty; ==> z Skipping ...) openjsonloadunit stationNamer!getIndex stationIDlenrange"convert_milliseconds_to_iso_formatdateutilparserparse astimezonepytzutcreplacefloatcalculateDataQualityr listkeys obvPeriodgetUnitConvertToM3perSecdictmapiteritems Exceptionr%str) r&Z jsonfilenameZ json_fileZ json_datar(ZofficeIdZ totalFctsidxrowt1terr3rr#EsL            zACE_Observation.loadCwmsjsonc s<zt|}|}|dddj}|d}|dj}|d||_|j|||_|d}|dk r~| |n|d }| |Wn>t k r} z t d t | d |d W5d} ~ XYnX|d||_t|jd t|jdf|_|ttfddt|j|_d|_dS)z Read real-time stream flow data from a given CWMS XML file Input: xmlfilename - the CWMS xml filename z query-infozrequested-itemr(z time-seriesofficer*zregular-interval-valuesNzirregular-interval-valueszWARNING: parsing XML error: r7z skipping ...rrcs$|d|dd|ddffSr0rr1r3rrr5s z-ACE_Observation.loadCWMSxml..r6)etreerDgetrootfindtextr<r!r=r>parseRegularIntervalValuesparseIrregularIntervalValuesrSr%rTrKr rLrMrNrOrPrQrRr;) r&Z xmlfilenameZobvwmlrootZname_1Z timeseriesrZZregularIntervalValuesZirregularIntervalValuesrYrr3rr$sB         zACE_Observation.loadCWMSxmlc Cs|d|_t|d}|dD]t}tj|dtj j dd}|j dD]<}t| dd|t| dd f|j|<||7}qZq$dS) Nr;intervalZsegmentz first-timer,  rr.)getr;rfindallrBrCrDrErFrGrHr^stripsplitrIrJr )r&ZregularIntervalrbsegZ beginTimesrrrr_s z*ACE_Observation.parseRegularIntervalValuescCst|d|_|jdD]R}|d}tj|dt j j dd}t |d| t |df|j|<qdS)Nr;rcrdrr,r.r/)rer;r^rgrhrBrCrDrErFrGrHrIrJr )r&ZirregularIntervalrjwordsrXrrrr`s   z,ACE_Observation.parseIrregularIntervalValuescCs6|jdkrd}n"|jdkr d}ntd|jd|S)NZcfsg!?ZCMSg?zFATAL ERROR: Unit z is not known. )r;r%)r&r4rrrrNs   z(ACE_Observation.getUnitConvertToM3perSeccCsdS)NgY@r)r&valuerrrrJsz$ACE_Observation.calculateDataQualitycCstj|dtjd}|dS)zf Converts milliseconds to ISO 8601 format (e.g., 2016-01-01 06:00:00) i)tzz%Y-%m-%d %H:%M:%S)r fromtimestamprrGstrftime)r& millisecondsdtrrrrAsz2ACE_Observation.convert_milliseconds_to_iso_formatN) __name__ __module__ __qualname____doc__r'r#r$r_r`rNrJrArrrrr1s;-  r)ossystimecsvrloggingstring collectionsrrrrdateutil.parserrBrFr9xml.etree.ElementTreer[ ElementTreerrr rrrrrrs(