U

������gr�������������������	���@���s����d�dl�Z�d�dlZd�dlZd�dlZd�dlZej�e�j�e�j�e�j�	e
�d��d���d�dlZd�dlZd�dl
T�d�dlmZ�d�dlmZmZ�d�dlZd�dlZd�dlm��mZ�d�dlmZ�d�dlmZ�G�d	d
��d
e�ZdS�)�����Nz..z/usgs_download/analysis/)�*)�OrderedDict)�datetime�	timedelta)�Observation)�	RFC_Sitesc�������������������@���sr��e�Zd�ZdZedd���Zejdd���Zedd���Zejdd���Zedd	���Zejd
d	���Zedd���Z	e	jd
d���Z	edd���Z
e
jdd���Z
edd���Zejdd���Zedd���Zejdd���Zedd���Z
e
jdd���Z
edd���Zejdd���Zedd���Zejdd���Zed d!���Zejd"d!���Zed#d$���Zejd%d$���Zed&d'���Zejd(d'���Zed)d*���Zejd+d*���Zed,d-���Zejd.d-���Zd/d0��Zd1d2��Zd3d4��Zd5d6��Zd7d8��Zd9d:��Zd;d<��Zd=d>��Zd?d@��ZdAdB��ZdCdD��ZdEdF��Z dGdH��Z!dIdJ��Z"dKdL��Z#dMdN��Z$dOdP��Z%dQdR��Z&dSdT��Z'dUdV��Z(dWdX��Z)dYdZ��Z*d[d\��Z+d]d^��Z,d_d`��Z-dfdbdc�Z.dgddde�Z/daS�)h�RFC_Forecastz0
           Store one RFC forecast data
        c�����������������C���s���|�j�S��N�Z_type��self��r
����G/lfs/h1/ops/prod/packages/nwm.v3.0.13/ush/rfc_ingestion/RFC_Forecast.py�type"���s����zRFC_Forecast.typec�����������������C���s
���||�_�d�S�r	���r
����r����tr
���r
���r���r���&���s����c�����������������C���s���|�j�S�r	����Z_parameterIdr���r
���r
���r����parameterId*���s����zRFC_Forecast.parameterIdc�����������������C���s
���||�_�d�S�r	���r����r����pr
���r
���r���r���.���s����c�����������������C���s���|�j�S�r	����Z_qualifierIdr���r
���r
���r����qualifierId2���s����zRFC_Forecast.qualifierIdc�����������������C���s
���||�_�d�S�r	���r���)r����qr
���r
���r���r���6���s����c�����������������C���s���|�j�S�r	����Z	_timeStepr���r
���r
���r����timeStep:���s����zRFC_Forecast.timeStepc�����������������C���s
���||�_�d�S�r	���r���r���r
���r
���r���r���>���s����c�����������������C���s���|�j�S�r	����Z
_forecastDater���r
���r
���r����forecastDateB���s����zRFC_Forecast.forecastDatec�����������������C���s
���||�_�d�S�r	���r���)r����fr
���r
���r���r���F���s����c�����������������C���s���|�j�S�r	����Z_creationDateTimer���r
���r
���r����creationDateTimeJ���s����zRFC_Forecast.creationDateTimec�����������������C���s
���||�_�d�S�r	���r���)r����cr
���r
���r���r���N���s����c�����������������C���s���|�j�S�r	����Z_missValr���r
���r
���r����missValR���s����zRFC_Forecast.missValc�����������������C���s
���||�_�d�S�r	���r!���)r����mr
���r
���r���r"���V���s����c�����������������C���s���|�j�S�r	����Z_latr���r
���r
���r����latZ���s����zRFC_Forecast.latc�����������������C���s
���||�_�d�S�r	���r$����r����lr
���r
���r���r%���^���s����c�����������������C���s���|�j�S�r	����Z_lonr���r
���r
���r����lonb���s����zRFC_Forecast.lonc�����������������C���s
���||�_�d�S�r	���r(���r&���r
���r
���r���r)���f���s����c�����������������C���s���|�j�S�r	����Z_xr���r
���r
���r����xj���s����zRFC_Forecast.xc�����������������C���s
���||�_�d�S�r	���r*���r&���r
���r
���r���r+���n���s����c�����������������C���s���|�j�S�r	����Z_yr���r
���r
���r����yr���s����zRFC_Forecast.yc�����������������C���s
���||�_�d�S�r	���r,���r&���r
���r
���r���r-���v���s����c�����������������C���s���|�j�S�r	����Z_zr���r
���r
���r����zz���s����zRFC_Forecast.zc�����������������C���s
���||�_�d�S�r	���r.���r&���r
���r
���r���r/���~���s����c�����������������C���s���|�j�S�r	����Z_timeValueQualityr���r
���r
���r����timeValueQuality����s����zRFC_Forecast.timeValueQualityc�����������������C���s
���||�_�d�S�r	���r0����r����vr
���r
���r���r1�������s����c�����������������C���s���|�j�S�r	����Z
_obvPeriodr���r
���r
���r����	fstPeriod����s����zRFC_Forecast.fstPeriodc�����������������C���s
���||�_�d�S�r	���r4���r���r
���r
���r���r5�������s����c�����������������C���s���|�j�S�r	����Z_rfcnamer���r
���r
���r����rfcname����s����zRFC_Forecast.rfcnamec�����������������C���s
���||�_�d�S�r	���r6���)r����rr
���r
���r���r7�������s����c�����������������C���s���||�_�|�d�}|�d�j|�_|�d�j|�_|�d�j|�_|�d�j|�_|�d�dk	rf|�d�j|�_nd|�_|�d�jd	�}|�d�jd
�}||f|�_	|�d�dk	r�t
�|�d�jd�d
�|�d�jd��d�|�_nd|�_|�d�dk	�rt
�|�d�jd�d
�|�d�jd��d�|�_
nd|�_
|�d�dk	�rXt
�|�d�jd
�|�d�j�d�|�_nd|�_|�d�j|�_t�t|�j���r�d|�_|�d�dk	�r�t|�d�j�|�_|�d�dk	�r�t|�d�j�|�_|�d�dk	�r�t|�d�j�|�_|�d�dk	�rt|�d�j�|�_|�d�dk	�r.t|�d�j�|�_|�d�j|�_t��|�_|�d�D�]�}t|jd��}t�|��rpd}tj|t|�j�dd��s�|d k��r�t|�j�}|t|jd!��d"f|�jt
�|jd�d
�|jd��d�<��qNt|�j�d k�r*t|�j����d �t|�j����d#�f|�_ |�j|�j d �k�r*|�j d �|�_|�!|��"���|�_#|�j#d$k�rX|�jt$d%d&��|�_
|�j#d'k�r�|�j
dk	�r�|�j|�j
�t$d(d&�k�r�|�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}timeStep�unitZ
multiplierz({http://www.wldelft.nl/fews/PI}startDate�date� �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}event�valueg�����8���-C��6?��abs_tolr����flagF������CNRFC�0�����hours�NCRFC����)%�source�find�textr����	stationIDZstationNamer���r����attribr���r����strptime�	startDater���r���r"����math�isnan�floatr%���r)���r+���r-���r/���r9���r���r1����iter�isclose�len�list�keysr5���ZgetRFCBySite�get5CharStationIDr7���r���)r���Zpixmlseries�stations�headerZtimeStepUnitZtimeStepMultiplier�eventr=���r
���r
���r����__init__����s�����
�
��
��
�
��
����
��
����
�
��
�
�
�
�
�
�
����
	�����zRFC_Forecast.__init__c�����������������C���sd���|�j�d�dkrt|�j�d��S�|�j�d�dkr<t|�j�d��d�S�|�j�d�dkr\t|�j�d��d�S�d�S�d�S�)Nr����second�����minute�<����houri��)r����intr���r
���r
���r����getTimeStepInSeconds(��s����z!RFC_Forecast.getTimeStepInSecondsc�����������������C���s���d|��f|�_�d�S�)Nr]���)r���)r���ZdtInSecr
���r
���r����setTimeStepInSeconds3��s����z!RFC_Forecast.setTimeStepInSecondsc�����������������C���s���|�j�S�r	����r5���r���r
���r
���r����
getTimePeriod6��s����zRFC_Forecast.getTimePeriodc�����������������C���sN���|�����rd�|�_d�|�_d�S�t|�j����d�t|�j����d�f|�_|�jd�|�_d�S�)Nr���rB���)�isEmptyr5���rO���rV���r1���rW���r���r
���r
���r����resetTimePeriod9��s�����zRFC_Forecast.resetTimePeriodc�����������������C���s
���|�j�d�S��Nr���re���r���r
���r
���r����getStartTimeD��s����zRFC_Forecast.getStartTimec�����������������C���sB���|�����r|�jS�|����rd�S�|�jd�k	r*|�jS�t��s:|�jd�S�d�S�d�S�ri���)�
isForecastr����
isObservedrO���rg���r5���r���r
���r
���r����getT0G��s����

zRFC_Forecast.getT0c�����������������C���s*���g�}|�j����D�]\}}|�|d���q|S�)N����)r1����items�append)r���ZsyntheticValues�kr3���r
���r
���r����getSyntheticValuesZ��s����zRFC_Forecast.getSyntheticValuesc�����������������C���s����t�dddg�}|�j|kr�g�}|�j���D�]�\}}|�jdkrn|�t|d�t|�j���dkrb|d�d�n|d���q&|�jdkr�|�t|d�t|�j���dkr�|d�d	�n|d���q&|�jd
kr�|�|d���q&t	d|�j���q&|��
��}|�j||dfS�d�S�d�S�)
N�RQOT�QINE�SQIN�CFSr���r>����i'h��?�KCFS�3}��Q<@�CMS�*FATAL Error: RFC_Forecast:  unknown unit: �d���)�setr���r1���ro���r9���rp����absrR���r"����RuntimeError�
getOffsetTimerL���)r����parameterset�valuesrq���r3����offsetr
���r
���r����getStationTimeValueInCMSQuality`��s0����

��
��
�z,RFC_Forecast.getStationTimeValueInCMSQualityc�����������������C���s����t�dddg�}g�}|�j|kr�|�j���D�]�\}}|�jdkrn|�t|d�t|�j���dkrb|d�d�n|d���q&|�jdkr�|�t|d�t|�j���dkr�|d�d	�n|d���q&|�jd
kr�|�|d���q&t	d|�j���q&|S�)Nrs���rt���ru���rv���r���r>���rw���rx���ry���rz���r{���)
r}���r���r1���ro���r9���rp���r~���rR���r"���r���)r���r����r����rq���r3���r
���r
���r����getValuesInCMSx��s,����

��
��
�zRFC_Forecast.getValuesInCMSc�����������������C���s^���d�}|�j�d�k	r$tt�|�j������}n6|�jd�k	rDtt�|�j�����}ntt�t��������}|S�r	���)r���rb���r<����mktime�	timetupler���r����now)r���Z	querytimer
���r
���r����getQueryTime���s����
�
�zRFC_Forecast.getQueryTimec�����������������C���s���|�j�d�|�����S�ri���)r5���rm���r���r
���r
���r���r�������s����zRFC_Forecast.getOffsetTimec�����������������C���sD���t�|�j�dkrdS�|����D�] }tj|t|�j�dd�s�dS�qdS�d�S�)Nr���Tr>���r?���F)rU���r1���r����rP���rT���rR���r"���r2���r
���r
���r���rg������s�����zRFC_Forecast.isEmptyc�����������������C���s&���t�|�j�dkr|�jd�d��S�|�jS�d�S�)N����)rU���rL���r���r
���r
���r���rX������s����zRFC_Forecast.get5CharStationIDc�����������������C���s���dS�)Nr|���r
���r���r
���r
���r����
getQuality���s����zRFC_Forecast.getQualityc�����������������C���s8���|�j�d�k	r|�j�dkrdS�|�j�d�k	r0|�j�dkr0dS�dS�d�S�)N�observedT�forecastF)r���r���r
���r
���r���rl������s����
�
�zRFC_Forecast.isObservedc�����������������C���sF���|�j�d�k	r|�j�dkrdS�|�j�d�k	r0|�j�dkr0dS�|�jd�k	r>dS�dS�d�S�)Nr����Tr����F)r���r���r���r
���r
���r���rk������s����
�
�
zRFC_Forecast.isForecastc�����������������C���s
��t�d|�������t�d|����r dnd��t�d|����r6dnd��t�d|�j���t�d|����d��d	��d
�|����d��d	��d���|����r�t�d
|�����d	����t�d|�jd��d�|�jd����t�d|�j	���t�d��|�j
���D�](\}}t�|�d�|d�|d�|d���q�d�S�)Nz	Station: z
isForecast:  �True�Falsez
isObserved:  zParameter:  z
Period:  (r���z%m/%d/%Y %H:%M:%Sz, r^����)zT0:  zTime step:  r;���zMissing Value:  z2Time              Value(org.)              Qualityz%m/%d/%Y %H:%Mrn���)�printrX���rk���rl���r���rf����strftimerm���r���r"���r1���ro���)r���rq���r3���r
���r
���r���r�������s,��������� zRFC_Forecast.printc�����������������C���sH���d�}|�j����D�]4\}}||kr>tj|d�t|�j�dd�sB|}q�qDq|S��Nr���r>���r?����r1���ro���rP���rT���rR���r"���)r���r���ZpreviousTimerq���r3���r
���r
���r����getPreviousValueTime���s����
�z!RFC_Forecast.getPreviousValueTimec�����������������C���sF���d�}|�j����D�]2\}}||krtj|d�t|�j�dd�s|}�qBq|S�r����r����)r���r���ZnextTimerq���r3���r
���r
���r����getNextValueTime���s����
�zRFC_Forecast.getNextValueTimec�����������������C���sh���g�}|�j����D�]2}|�j�|�}tj|d�t|�j�dd�r|�|��q|r\|D�]}|�j��|��qJ|�����d�S�r����)	r1���rW���rP���rT���rR���r"���rp����poprh���)r���Z
keyMissValrq���r3���r
���r
���r����removeMissVals���s����
�zRFC_Forecast.removeMissValsc�����������������C���s����|�����}t|����d�}|�jd�|tdd��kr||�j|�jd��d�}|�j�|�jd�|�d|dfi��|�jj|�jd�|�dd��|�jd�|td	d��k�r�|�j|�jd��d�}|�j�|�jd�|�d|dfi��|�jj|�jd�|�d
d��|�����d�S�)N��secondsr���rD���rE���r^������������F��last�����T)rm���r���rc���r5���r1����update�move_to_endrh���)r����t0�dtrA���r
���r
���r����addLeadingAndTrailingZeros���s.������������z'RFC_Forecast.addLeadingAndTrailingZerosc�����������������C���s���|������|����r|�jS�t|�j����d�}t|�j����d�}t��}||k�r2||�jkrd|�j|�||<�n�|��|�}|��|�}||����dkr�t	|�j
�ddf||<�n�|�j|�d�|�j|�d��||����||������|�j|�d��|�j|�d�|�j|�d��||����||������|�j|�d��df||<�||�}q@|����t|����k�rZ|��
t|������t|����d�t|����d�f|�_|�jd�|�_||�_|S�)Nr���rB�������r����Fr^���T)r����rg���r1���rV���rW���r���r����r�����
total_secondsrR���r"���rc���rb���rd���r5���rO���)r���r����r���r�����tvq�t1�t2r
���r
���r����linearInterpolate��sP����



�

����

����
"zRFC_Forecast.linearInterpolatec�����������������C���s��|������t|�j����d�}t|�j����d�}t��}||kr�||�jkrT|�j|�||<�nR|��|�}||����dkr�t|�j�ddf||<�n"|�j|�d�|�j|�d�df||<�||�}q2|��	��t
|����kr�|��t
|������t|����d�t|����d�f|�_|�jd�|�_
||�_|S�)Nr���rB�����/
�r����Fr^���T)r����rV���r1���rW���r���r����r����rR���r"���rc���rb���rd���r5���rO���)r���r����r���r����r����r����r
���r
���r����interForwardPersistH��s*����

�
"z RFC_Forecast.interForwardPersistc�����������������C���s^��|������|����r|�jS�t|�j����d�}t|�j����d�}|����}t��}||k��rX||�jkrl|�j|�||<�n�|��|�}|��|�}|r�|s�t	|�j
�ddf||<�n�||����dkr�t	|�j
�ddf||<�n�|�j|�d�|�j|�d��||����||������|�j|�d��|�j|�d�|�j|�d��||����||������|�j|�d��df||<�||�}qH|}||k�r�||�jk�r�|�j|�||<�np|��|�}|�r�||����dk�r�t	|�j
�ddf||<�n"|�j|�d�|�j|�d�df||<�nt	|�j
�ddf||<�||�}�q\|����t
|����k�r&|��t
|������t|����d�t|����d�f|�_|�jd�|�_||�_|S�)Nr���rB���r����Tr����r^���r����)r����rg���r1���rV���rW���rm���r���r����r����rR���r"���r����rc���rb���rd���r5���rO���)r���r����r���r����r����r����r����r����r
���r
���r����'linearInterpolateAndInterForwardPersisti��sr����



�

����

����


�
"z4RFC_Forecast.linearInterpolateAndInterForwardPersistNc�����������	������C���s$��|�����r|�jS�t|�j����d�}t|����d�}||kr:d�S�|�j|�}|}||�}||�|krd||�}||kr�|�j�|t|t�s�|d�n||d�dfi��|�jj	|dd��||�}qd||�|k�r||�}||k�r|�j�|t|t�s�t|�j
�n|ddfi��|�jj	|dd��||�}q�|�����|�jS�)Nr���r����r^���TFr����r����)rg���r1���rV���rW���r���rc���r�����
isinstancerR���r����r"���rh���)	r���r���Zmaxtr3����startr����Z
firstvaluer�����itr
���r
���r����persistBackward���s>����
��

��
zRFC_Forecast.persistBackwardc�����������������C���s����|�����r|�jS�t|�j����d�}||kr.|�jS�t|����d�}tj|�j|�d�t|�j	�dd�rf||�}q<|�j|�}||�}||kr�t
|t�s�|d�n||d�df|�j|<�||�}qx|�����|�jS�)NrB���r����r���r>���r?���r^���T)rg���r1���rV���rW���r���rc���rP���rT���rR���r"���r����rh���)r���r���r3����endr����Zvlastr
���r
���r����persistForward���s,�������

��

zRFC_Forecast.persistForward)N)N)0�__name__�
__module__�__qualname__�__doc__�propertyr����setterr���r���r���r���r���r"���r%���r)���r+���r-���r/���r1���r5���r7���r\���rc���rd���rf���rh���rj���rm���rr���r����r����r����r����rg���rX���r����rl���rk���r����r����r����r����r����r����r����r����r����r����r
���r
���r
���r���r������s����





























�


/!R
0r���)�os�sysr<����csv�re�pathrp����abspath�join�dirname�__file__�loggingrP����string�collectionsr���r���r����dateutil.parser�dateutil�pytz�xml.etree.ElementTree�etree�ElementTreer���r���r���r
���r
���r
���r����<module>���s���("�