U gr @sddlZddlZddlZddlZddlZejejejej e ddddl Z ddl Z ddl TddlmZddlmZmZddlZddlZddlmmZddlmZddlmZGd d d eZdS) Nz..z/usgs_download/analysis/)*) OrderedDict)datetime timedelta) Observation) RFC_Sitesc@sreZdZdZeddZejddZeddZejddZedd Zejd d Zed d Z e jd d Z eddZ e jddZ eddZ e jddZ eddZ e jddZ eddZ e jddZ eddZejddZeddZejddZed d!Zejd"d!Zed#d$Zejd%d$Zed&d'Zejd(d'Zed)d*Zejd+d*Zed,d-Zejd.d-Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Zd=d>Zd?d@ZdAdBZdCdDZdEdFZ dGdHZ!dIdJZ"dKdLZ#dMdNZ$dOdPZ%dQdRZ&dSdTZ'dUdVZ(dWdXZ)dYdZZ*d[d\Z+d]d^Z,d_d`Z-dfdbdcZ.dgdddeZ/daS)h RFC_Forecastz0 Store one RFC forecast data cCs|jSNZ_typeselfr G/lfs/h1/ops/prod/packages/nwm.v3.0.13/ush/rfc_ingestion/RFC_Forecast.pytype"szRFC_Forecast.typecCs ||_dSr r r tr r rr&scCs|jSr Z _parameterIdr r r r parameterId*szRFC_Forecast.parameterIdcCs ||_dSr rr pr r rr.scCs|jSr Z _qualifierIdr r r r qualifierId2szRFC_Forecast.qualifierIdcCs ||_dSr r)r qr r rr6scCs|jSr Z _timeStepr r r rtimeStep:szRFC_Forecast.timeStepcCs ||_dSr rrr r rr>scCs|jSr Z _forecastDater r r r forecastDateBszRFC_Forecast.forecastDatecCs ||_dSr r)r fr r rrFscCs|jSr Z_creationDateTimer r r rcreationDateTimeJszRFC_Forecast.creationDateTimecCs ||_dSr r)r cr r rrNscCs|jSr Z_missValr r r rmissValRszRFC_Forecast.missValcCs ||_dSr r!)r mr r rr"VscCs|jSr Z_latr r r rlatZszRFC_Forecast.latcCs ||_dSr r$r lr r rr%^scCs|jSr Z_lonr r r rlonbszRFC_Forecast.loncCs ||_dSr r(r&r r rr)fscCs|jSr Z_xr r r rxjszRFC_Forecast.xcCs ||_dSr r*r&r r rr+nscCs|jSr Z_yr r r ryrszRFC_Forecast.ycCs ||_dSr r,r&r r rr-vscCs|jSr Z_zr r r rzzszRFC_Forecast.zcCs ||_dSr r.r&r r rr/~scCs|jSr Z_timeValueQualityr r r rtimeValueQualityszRFC_Forecast.timeValueQualitycCs ||_dSr r0r vr r rr1scCs|jSr Z _obvPeriodr r r r fstPeriodszRFC_Forecast.fstPeriodcCs ||_dSr r4rr r rr5scCs|jSr Z_rfcnamer r r rrfcnameszRFC_Forecast.rfcnamecCs ||_dSr r6)r rr r rr7scCs||_|d}|dj|_|dj|_|dj|_|dj|_|ddk rf|dj|_nd|_|djd }|djd }||f|_ |d dk rt |d jd d |d jdd|_ nd|_ |ddk rt |djd d |djdd|_ nd|_ |ddk rXt |djd |djd|_nd|_|dj|_tt|jrd|_|ddk rt|dj|_|ddk rt|dj|_|ddk rt|dj|_|ddk r t|dj|_|ddk r.t|dj|_|dj|_t|_|dD]}t|jd}t|rpd}tj|t|jdds|d krt|j}|t|jd!d"f|jt |jd d |jdd<qNt|jd kr*t|jd t|jd#f|_ |j |j d kr*|j d |_ |!|"|_#|j#d$krX|j t$d%d&|_ |j#d'kr|j dk r|j |j t$d(d&kr|j |_ dS))ze Initialize the RFC_Forecast object with a given pixml series z%{http://www.wldelft.nl/fews/PI}headerz#{http://www.wldelft.nl/fews/PI}typez){http://www.wldelft.nl/fews/PI}locationIdz*{http://www.wldelft.nl/fews/PI}stationNamez*{http://www.wldelft.nl/fews/PI}parameterIdz*{http://www.wldelft.nl/fews/PI}qualifierIdNz'{http://www.wldelft.nl/fews/PI}timeStepunitZ multiplierz({http://www.wldelft.nl/fews/PI}startDatedate timez%Y-%m-%d %H:%M:%Sz+{http://www.wldelft.nl/fews/PI}forecastDatez+{http://www.wldelft.nl/fews/PI}creationDatez+{http://www.wldelft.nl/fews/PI}creationTimez&{http://www.wldelft.nl/fews/PI}missValz-999z"{http://www.wldelft.nl/fews/PI}latz"{http://www.wldelft.nl/fews/PI}lonz {http://www.wldelft.nl/fews/PI}xz {http://www.wldelft.nl/fews/PI}yz {http://www.wldelft.nl/fews/PI}zz${http://www.wldelft.nl/fews/PI}unitsz${http://www.wldelft.nl/fews/PI}eventvalueg8-C6?abs_tolrflagFCNRFC0hoursNCRFC )%sourcefindtextr stationIDZ stationNamerrattribrrstrptime startDaterrr"mathisnanfloatr%r)r+r-r/r9rr1iteriscloselenlistkeysr5Z getRFCBySiteget5CharStationIDr7r)r Z pixmlseriesstationsheaderZ timeStepUnitZtimeStepMultipliereventr=r r r__init__s                      zRFC_Forecast.__init__cCsd|jddkrt|jdS|jddkri'h?KCFS3}Q<@CMS*FATAL Error: RFC_Forecast: unknown unit: d) setrr1ror9rpabsrRr" RuntimeError getOffsetTimerL)r parametersetvaluesrqr3offsetr r rgetStationTimeValueInCMSQuality`s0    z,RFC_Forecast.getStationTimeValueInCMSQualitycCstdddg}g}|j|kr|jD]\}}|jdkrn|t|dt|jdkrb|ddn|dq&|jdkr|t|dt|jdkr|dd n|dq&|jd kr||dq&t d |jq&|S) Nrsrtrurvrr>rwrxryrzr{) r}rr1ror9rpr~rRr"r)r rrrqr3r r rgetValuesInCMSxs,    zRFC_Forecast.getValuesInCMScCs^d}|jdk r$tt|j}n6|jdk rDtt|j}nttt}|Sr )rrbr<mktime timetuplerrnow)r Z querytimer r r getQueryTimes  zRFC_Forecast.getQueryTimecCs|jd|Sri)r5rmr r r rrszRFC_Forecast.getOffsetTimecCsDt|jdkrdS|D] }tj|t|jddsdSqdSdS)NrTr>r?F)rUr1rrPrTrRr"r2r r rrgs zRFC_Forecast.isEmptycCs&t|jdkr|jddS|jSdS)N)rUrLr r r rrXszRFC_Forecast.get5CharStationIDcCsdS)Nr|r r r r r getQualityszRFC_Forecast.getQualitycCs8|jdk r|jdkrdS|jdk r0|jdkr0dSdSdS)NobservedTforecastF)rr r r rrls  zRFC_Forecast.isObservedcCsF|jdk r|jdkrdS|jdk r0|jdkr0dS|jdk r>dSdSdS)NrTrF)rrr r r rrks   zRFC_Forecast.isForecastcCs td|td|r dndtd|r6dndtd|jtd|dd d |d d d |rtd |d td|jd d|jdtd|j td|j D](\}}t|d|d|d |dqdS)Nz Station: z isForecast: TrueFalsez isObserved: z Parameter: z Period: (rz%m/%d/%Y %H:%M:%Sz, r^)zT0: z Time step: r;zMissing Value: z2Time Value(org.) Qualityz%m/%d/%Y %H:%Mrn) printrXrkrlrrfstrftimermrr"r1ro)r rqr3r r rrs,  zRFC_Forecast.printcCsHd}|jD]4\}}||kr>tj|dt|jddsB|}qqDq|SNrr>r?r1rorPrTrRr")r rZ previousTimerqr3r r rgetPreviousValueTimes z!RFC_Forecast.getPreviousValueTimecCsFd}|jD]2\}}||krtj|dt|jdds|}qBq|Srr)r rZnextTimerqr3r r rgetNextValueTimes zRFC_Forecast.getNextValueTimecCshg}|jD]2}|j|}tj|dt|jddr||q|r\|D]}|j|qJ|dSr) r1rWrPrTrRr"rppoprh)r Z keyMissValrqr3r r rremoveMissValss  zRFC_Forecast.removeMissValscCs|}t|d}|jd|tddkr||j|jdd}|j|jd|d|dfi|jj|jd|dd|jd|td dkr|j|jdd}|j|jd|d|dfi|jj|jd|d d|dS) NsecondsrrDrEr^FlastT)rmrrcr5r1update move_to_endrh)r t0dtrAr r raddLeadingAndTrailingZeross.z'RFC_Forecast.addLeadingAndTrailingZeroscCs||r|jSt|jd}t|jd}t}||kr2||jkrd|j|||<n||}||}||dkrt |j ddf||<n|j|d|j|d|||||j|d|j|d|j|d|||||j|ddf||<||}q@| t |krZ| t |t|dt|df|_|jd|_||_|S)NrrBrFr^T)rrgr1rVrWrrr total_secondsrRr"rcrbrdr5rO)r rrrtvqt1t2r r rlinearInterpolatesP               " zRFC_Forecast.linearInterpolatecCs|t|jd}t|jd}t}||kr||jkrT|j|||<nR||}||dkrt|jddf||<n"|j|d|j|ddf||<||}q2| t |kr| t |t|dt|df|_ |j d|_ ||_|S)NrrB/ rFr^T)rrVr1rWrrrrRr"rcrbrdr5rO)r rrrrrr r rinterForwardPersistHs*     " z RFC_Forecast.interForwardPersistcCs^||r|jSt|jd}t|jd}|}t}||krX||jkrl|j|||<n||}||}|r|st |j ddf||<n|| dkrt |j ddf||<n|j|d|j|d|| || |j|d|j|d|j|d|| || |j|ddf||<||}qH|}||kr||jkr|j|||<np||}|r|| dkrt |j ddf||<n"|j|d|j|ddf||<nt |j ddf||<||}q\| t | kr&|t | t|dt|df|_|jd|_||_|S)NrrBrTrr^r)rrgr1rVrWrmrrrrRr"rrcrbrdr5rO)r rrrrrrrr r r'linearInterpolateAndInterForwardPersistisr                      " z4RFC_Forecast.linearInterpolateAndInterForwardPersistNc Cs$|r|jSt|jd}t|d}||kr:dS|j|}|}||}|||krd||}||kr|j|t|ts|dn||ddfi|jj |dd||}qd|||kr||}||kr|j|t|tst|j n|ddfi|jj |dd||}q| |jS)Nrrr^TFrr) rgr1rVrWrrcr isinstancerRrr"rh) r rZmaxtr3startrZ firstvalueritr r rpersistBackwards>     zRFC_Forecast.persistBackwardcCs|r|jSt|jd}||kr.|jSt|d}tj|j|dt|j ddrf||}q<|j|}||}||krt |ts|dn||ddf|j|<||}qx| |jS)NrBrrr>r?r^T) rgr1rVrWrrcrPrTrRr"rrh)r rr3endrZvlastr r rpersistForwards,    zRFC_Forecast.persistForward)N)N)0__name__ __module__ __qualname____doc__propertyrsetterrrrrrr"r%r)r+r-r/r1r5r7r\rcrdrfrhrjrmrrrrrrrgrXrrlrkrrrrrrrrrrr r r rrs                                      /!R 0r)ossysr<csvrepathrpabspathjoindirname__file__loggingrPstring collectionsrrrdateutil.parserdateutilpytzxml.etree.ElementTreeetree ElementTreerrrr r r rs("