U

������g�U����������������������@���sj���d�dl�Z�d�dlZd�dlZd�dlZd�dlT�d�dlmZmZ�d�dlZd�dlZd�dl	Z
d�dlZG�dd��d�ZdS�)�����N)�*)�datetime�	timedeltac�������������������@���s��e�Zd�ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZ
d
ZdZd
Zd
Zd
ZdZd
ZdZdZdZdZdZedd���Zejdd���Zedd���Zejdd���Zdd��Zdd��Zdd��Z d d!��Z!d"d#��Z"d$d%��Z#d&d'��Z$d(d)��Z%d9d+d,�Z&d-d.��Z'd:d0d1�Z(e)d2d3���Z*d4d5��Z+d6d7��Z,d8S�);�
RFCTimeSeriesz�
           Description: Store one RFC time series data
           Author: Zhengtao Cui (Zhengtao.Cui@noaa.gov)
           Date: July. 10, 2019
           Date modified: 
        ����z!RFC station identifer of length 5�����UTCzYYYY-MM-DD_HH:mm:ss UTC����zm^3/sa���Obsverved and forecasted discharges. There are 48 hours of observed values before issue time (T0), that is the start time is T0 - 48 hours. Values after T0 (including T0) are forecasts that genenrally extend to 10 days, that is T0 + 240 hours. The total length of dischargs is 12 days in general except in cases where forecasts or observations that are longer than 10 days or 2 days respectively are available.�-zPWhether the discharge value is synthetic or orginal, 1 - synthetic, 0 - originalz/Discharge quality 0 to 100 to be scaled by 100.z2Total count of all observation and forecast valuesz Total observed values before T0.z/Total forecasted values including and after T0.�secondsz0Frequency/temporal resolution of forecast values�*seconds since 1970-01-01 00:00:00 local TZzQuery time at RFCc�����������������C���s���|�j�S��N�Z_issueTimeStamps��self��r����H/lfs/h1/ops/prod/packages/nwm.v3.0.13/ush/rfc_ingestion/RFCTimeSeries.py�issueTimeStamps@���s����zRFCTimeSeries.issueTimeStampsc�����������������C���s
���||�_�d�S�r
���r���)r���Zitsr���r���r���r���C���s����c�����������������C���s���|�j�S�r
����Z_startTimeStampr���r���r���r����startTimeStampG���s����zRFCTimeSeries.startTimeStampc�����������������C���s
���||�_�d�S�r
���r���)r����stsr���r���r���r���J���s����c�����������������C���s@���||�_�||�_||�_||�_||�_||�_||�_||�_|	|�_|
|�_	dS�)a0��
              Initialize a RFC TimeSeries object
              Input: time_stamp - a time stamp
                     resolution - time resolution of the time series
                       station_time_value - Tuple of (station, time, flow, 
                                          quality)
           N)
r����seriesTimeResolution�	stationIDr����
discharges�discharge_qualities�
synthetics�	timeSteps�	querytime�missingValue)r���ZstaID�
time_stamp�
resolutionZ	starttime�dis�qualityr���Ztimestepr����missValr���r���r����__init__N���s����	zRFCTimeSeries.__init__c�����������������C���s���|�j��S�)z\
               Test if the time series is empty
               Return: boolean
            �r���r���r���r���r����isEmptyb���s����zRFCTimeSeries.isEmptyc�����������������C���s����t�d|�j������t�|�j��t�|�j��t�|�j��t�|�j��t|�j|�j�D�]6\}}t�d|����d�|�j���|D�]}t�d|��qnqHdS�)z?
                   Print the time series data
                zSeries: start time: z    issue time: � z
             N)�printr����	isoformatr���r���r���r����zip)r����	issuetimer!����vr���r���r����print_station_offsettime_valuei���s$�����



��
��z,RFCTimeSeries.print_station_offsettime_valuec�����������������C���s"���g�}|�j�D�]}|�t|���q
|S�r
���)r����append�len)r����countsr!���r���r���r����get_total_counts{���s����
zRFCTimeSeries.get_total_countsc�����������������C���s8���g�}t�|�j|�j�D�] \}}|�||�j����|���q|S�r
���)r*���r���r���r.���r����
total_seconds)r���r0����t�sr���r���r����get_observed_counts����s�����z!RFCTimeSeries.get_observed_countsc�����������������C���s8���g�}|�����}t||�j�D�]\}}|�t|�|���q|S�r
���)r5���r*���r���r.���r/���)r���r0����	obvcounts�ocr!���r���r���r����get_forecast_counts����s
����z!RFCTimeSeries.get_forecast_countsc�����������������C���s`���t�|�j�}t|�|�jk�r<tt|�|�j�D�]}|�dd��q(n t|�|�jkr\|d|�jd���}|S�)zt
                 Get all station ids of the time series
                 Return: list of station ids
              r���r'�������)�listr���r/����stationIdStrLen�range�insert)r����station�ir���r���r����getStationID����s����
zRFCTimeSeries.getStationIDc�����������������C���s���|�j�S�)z{
                 Get all stream flow values of the time series
                 Return: list of flow values
              r%���r���r���r���r����getDischargeValues����s����z RFCTimeSeries.getDischargeValues�RFCTimeSeries.ncdfc�����������������C���sP���|�j�d��d�tt|�jjd�d�|�jjd�����d��d�|�j�d�|�}|S�)zh
              Get NetCDF file for this time series
              Return: A NetCDF filename
            �����z%Y-%m-%d_%H.�����<�������zmin.�.)	r����strftime�str�intr����daysr����zfillr���)r����suffix�filenamer���r���r����getSeriesNCFileName����s"����
��������z!RFCTimeSeries.getSeriesNCFileNamec�����������������C���s���|�j�S�)z~
                Get discharge quality for this time series
                Return: A list of discharge quality
              )r���r���r���r���r����getDischargeQualities����s����z#RFCTimeSeries.getDischargeQualities�./c��������������	���C���s&��t�j|d�|��|��ddd�}|�d|�j��|�d|�j��|�dd��|�d	t|�j���|�d
d��|�dd
d�}|�	|�j
dd���|�dd
d�}|�	|�j|�jd���|�ddd�}|�	|�j
|�jd���|�ddd�}|�	|�j|�jd���|�ddd�}|�	|�j|�jd���|�ddd�}	|	�	|�j|�jd���|�ddd�}
|
�	|�j|�jd���|�ddd�}|�	|�j|�jd���|�d dd�}|�	|�j|�jd!d"���|�d#d$d�}
|
�	d%d&i��|�	t����d'�|�j�d'�tt |�j!j"d(�d)�|�j!j#d)�����$d*�|�j%tt|�j�d+��d,d-���t&�'|�j�|dd�dd�f<�t&�'|�j(�|dd�dd�f<�g�}t&�)t|�j*�fd.t+|�j���}t,t|�j*��D�]}|�j*|��d'�||<��qzt��-|�|dd�dd�f<�|�j.|
dd�<�|��/��|dd�<�|��0��|	dd�<�|��1��|
dd�<�|�j2|dd�<�|��3��|dd�<�|�j4|dd�<�|�5���dS�)/z�
              Write the time series to a NetCDF file
              Input: outputdir - the directory where to write the NetCDF 
            �/�w�NETCDF4)�formatr;����
timeStrLen�forecastIndN�nseries�zeror����	stationId�S1)r;���r
���)�	long_name�units�issueTimeUTC)rX���rV���)r\���Zuntsr����f4)rX���rW����synthetic_values�i1ZtotalCounts�i2)rX���ZobservedCountsZforecastCountsr����i4r���z0.01)r\���r]����
multfactor�	queryTime�i8r]���r����%Y-%m-%d_%H:%M:00rD���rE���rF���r9���zv2.1)�fileUpdateTimeUTC�sliceStartTimeUTC�sliceTimeResolutionMinutesr����newest_forecastZNWM_version_number�S)6�netCDF4�DatasetrO����createDimensionr;���rV���r/���r����createVariable�	setncatts�stationIdLong_name�
timeLong_name�timeUnit�dischargeLong_name�
dischargeUnit�syntheticsLong_name�syntheticsUnit�totalCountsLong_name�totalCountsUnit�observedCountsLong_name�observedCountsUnit�forecastCountsLong_name�forecastCountsUnit�timeStepsLong_name�
timeStepsUnit�dischargeQualaityLong_name�dischargeQualityUnitr����utcnowrH���r���rI���rJ���r���rK���r���rL���r����np�asarrayr����emptyr����reprr<����stringtocharr���r1���r5���r8���r���r@���r����close)r����	outputdirrM����nc_fidrZ���r+���r���r���Ztotalcountsr6���Z	fstcountsr���r���re���Ztimestrings�nr���r���r����toNetCDF����s����������������������������

�����
zRFCTimeSeries.toNetCDFc�����������������C���s6��t��|d�}t�|�d�d�}tt|�d��d�}|�d�}|�d�}t��|jd�d	d	���}|jd
�d	d	�d	d	�f��	��}|jd�d	d	�d	d	�f��	��}	dd
��|jd�d	d	��D��}
dd
��|jd�d	d	��D��}dd
��|jd�d	d	��D��}dd
��t��|jd�d	d	���D��}
|�
���|�t|�|
|||||	||
|�
S�)zy
              Read the time series from a NetCDF file
              Input: ncfilename - the NetCDF filename
            �rri���rg���rj���)�minutesr���rk���rZ���Nr���r`���c�����������������S���s���g�|�]}t�|��qS�r����rJ�����.0�xr���r���r����
<listcomp>[��s�����z,RFCTimeSeries.fromNetCDF.<locals>.<listcomp>re���c�����������������S���s���g�|�]}t�|��qS�r���r����r����r���r���r���r����_��s�����r���c�����������������S���s���g�|�]}t�|��qS�r���r����r����r���r���r���r����b��s�����r���c�����������������S���s���g�|�]}t��|d���qS�)rg���)r����strptime)r����r3���r���r���r���r����g��s����r^���)rm���rn���r���r�����	getncattrr���rJ����chartostring�	variables�tolistr����rI���)r����
ncfilenamer����r����
time_resolr#���Z
newest_seriesr>���r���r���re���Z	qualitiesr���Z
issueTimesr���r���r����
fromNetCDFB��sN������

�����������zRFCTimeSeries.fromNetCDFc�����������
������C���sX��dS�td��dS�g�}tt|�j��D�]P}tt|j��D�]<}|�j|�|j|�kr4|j|�|�j|<�|j	|�|�j	|<��q"q4q"tt|j��D�]F}d}tt|�j��D�] }|�j|�|j|�kr�d}�q�q�|s�|�
|��q�|�rP|D��]x}t|�jd��t|j|��k��r�n�t|�jd��t|j|��k��r�|�jD�]8}tt|�jd��t|j|���D�]}|�
|�j���q@�q|�j	D�]6}	tt|�j	d��t|j	|���D�]}|	�
d���q��q^nHtt|j|��t|�jd���D�](}|j|��
|�j��|j	|��
d���q�|�j�
|j|���|�j	�
|j	|���|�j�
|j|���|�j�
|j|���|�j�
|j|���|�j
�
|j
|�����q�dS�dS�)z�
              Merge data in an existing NetCDF time series file with this one
              Input: oldTimeSeries - the NetCDF filename of the existing time
                                    series
              FzeThe two time series  have different start time, temporal resolutions, or station IDs, not merging ...TrC���r9���N)r���r���r���r���r(���r<���r/���r���r���r���r.���r���r���r���)
r���Z
oldTimeSeriesZextraIssueTimesr�����m�foundr?����d�jr4���r���r���r����mergeOldu��s�����������������
��
�
��
���zRFCTimeSeries.mergeOldc�����������������C���sX��|�j�|j�krdS�|�j|jkr dS�|�j|jkr0dS�t|�j�t|j�krHdS�t|�j�t|j�kr`dS�|�j|jkrpdS�|�j|jkr�dS�|�j|jkr�dS�|�j	|j	kr�dS�t
|�j|j�D�]J\}}t|�t|�kr��dS�t
||�D�] \}}tj||dd�s���dS�q�q�t
|�j|j�D�]J\}}t|�t|�k�r(�dS�t
||�D�]\}}||k�r2��dS��q2�qdS�)NFg����MbP?)�abs_tolT)
r���r���r���r/���r���r���r���r���r���r���r*����math�isclose)r���ZotherTimeSeriesr�����y�a�br���r���r����compare���sF������
zRFCTimeSeries.compareN)rB���)rQ���rB���)-�__name__�
__module__�__qualname__�__doc__r;���rr���rV���rt���rs���ZqualifierStrLenrv���ru���rx���rw���r����r����rz���ry���r|���r{���r~���r}���r����r���Z
queryTimeUnitZqueryTimeLong_name�propertyr����setterr���r$���r&���r-���r1���r5���r8���r@���rA���rO���rP���r�����classmethodr����r����r����r���r���r���r���r������s`����





�
2Kr���)
�os�sys�timer�����stringr���r����calendarrm����numpyr�����randomr���r���r���r���r����<module>���s���