U ������gr������������������� ���@���s����d�dl�Z�d�dlZd�dlZd�dlZd�dlZej�e�j�e�j�e�j� e �d��d���d�dlZd�dlZd�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���Zejdd���Zedd���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 �rt|�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|�jt$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���ZgetRFCBySite�get5CharStationIDr7���r���)r���Zpixmlseries�stations�headerZtimeStepUnitZtimeStepMultiplier�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||dfS�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: zParameter: z Period: (r���z%m/%d/%Y %H:%M:%Sz, r^����)zT0: zTime 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���ZpreviousTimerq���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|�_|�jd�|�_ ||�_|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���("�