U ������g�U����������������������@���sj���d�dl�Z�d�dlZd�dlZd�dlZd�dlT�d�dlmZmZ�d�dlZd�dlZd�dl Z d�dlZG�dd��d�ZdS�)�����N)�*)�datetime� timedeltac�������������������@���s��e�Zd�ZdZdZdZdZdZdZdZ dZ d Zd ZdZ d ZdZd 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��|�dd d�}|� |�j dd���|�dd d�}|� |�j|�jd���|�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�� ��} dd ��|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���