U gJ@sddlZddlZddlZddlZddlTddlmZmZddlmm Zddl m Z ddl Z ddl m Z GdddZ Gdd d ZdS) N)*)datetime timedelta) TimeSliceC)EmptyDirOrFileExceptionc@s.eZdZdZddZddZefddZdS) WSC_ObservationzStore one WSC data set c Cst|_d}t|dddX}tj||d}t||D]4}zD|d}t|d}|d}t|d krtd t|d Wq8Wnd }YnXd} zX|d  d} | d} | dddd} | d| } t | d}|}|j t jd} Wn4tk r$}ztd||W5d}~XYnX| rV|dkrV||t|}||f|j| <n d|j| <d|d|_q8W5QRXt|j}|d|df|_|j|_|d|_d|_dS)N)IDDateuParameter/ParamÃre Value/ValeurQualifier/QualificatifzSymbol/SymbolezApproval/Approbationrz ISO-8859-1)encoding)Z fieldnamesr g?r z==>Skip ICE conditions  ... ~.r TrZ00 z%Y-%m-%d %H:%M:%Stzinfozcannot parse date... {})rrzCAN.rzm3/s)dict timevalueopencsvZ DictReadernextfloatintprintsplitrstrptimereplacepytzUTC ExceptionformatcalculateDataQuality stationIDsortedkeys obvPeriodZ stationNameZgenerationTimeZunit)selfZ csvfilenameZ csvfieldsZcsvfilereaderrowZdischstrZ dischargeZqstrZdkeysZymdZhmsZdsnzZdtnzZdtueZ dataqualityZtimekeysr1L/lfs/h1/ops/prod/packages/nwm.v3.0.13/ush/canada_download/WSC_Observation.py__init__sT         zWSC_Observation.__init__cCsd}|S)z Calculate a quality code for the discharge measurement based on the value and associated QA/QC code. The defined QA/QC codes are: 1 = preliminary, 2 = reviewed, 3 = checked, 4 = approved dr1)r,valueZqacodeZqualityr1r1r2r'scz$WSC_Observation.calculateDataQualitycCszg}g}t|jD]0}t||}||dkr||||q|rrddtt||Dd}||j|fSdSdS)NcSsg|] \}}|qSr1r1).0yxr1r1r2 sz2WSC_Observation.getTimeValueAt..r)r)rabsappendzip)r,Zat_time resolutionZ closestTimesZ distanceskZtdZclosestr1r1r2getTimeValueAts    zWSC_Observation.getTimeValueAtN)__name__ __module__ __qualname____doc__r3r'rr@r1r1r1r2rsutrc@s@eZdZdZddZddZddZdd Zd d Zd d Z dS)All_WSC_Observationsz'Store all WSC data in a given directoryc Csv||_g|_tj|s(td|dttdd}t |D]}| drD|d|}t |}t |j |krDz$td|d|jt|WqDtk r}z$td |d t|WYqDW5d}~XYqDXqD|jstd |d d |_|jdj|_|jD]^}|jd|jdkrB|jd|jdf|_|jd|jdkr|jd|jdf|_qdS)Nz FATAL ERROR: z' is not a directory or does not exist. r6daysz.csv/zReading rz!WARNING: parsing CSV file error: z, skipping ... zInput directory z\ has no Water Survey of Canada CSV files or the Water Survey CSV files contain no flow data!rrr)sourcewscobvsospathisdir RuntimeErrorrnowrlistdirendswithstat fromtimestampst_mtimerr<rr%rindexr+ timePeriod)r,Z wscdatadirZ twodaysagofileZfnamestr0obvr1r1r2r3sD     zAll_WSC_Observations.__init__cCs|SNr1r,r1r1r2__iter__;szAll_WSC_Observations.__iter__cCs6|jt|jdkrd|_t|jd|_|j|jS)Nrr)rUlenrJ StopIterationr[r1r1r2r>s  zAll_WSC_Observations.nextcCs|jSrZ)rVr[r1r1r2timePeriodForAllEsz%All_WSC_Observations.timePeriodForAllc Csdg}|jD]H}|||}|r |d}|dd}|dd}||j|||fq t|||} | S)Nrr)rJr@r<r(r) r, timestamptimeresolutionZstation_time_value_listrYZ closestObvZc0Zc10Zc11Z timeSlicer1r1r2 makeTimeSliceNs     z"All_WSC_Observations.makeTimeSlicec Csd|jdkrtdtjtjdtdd}|jdkrf|jdkrft|j |j |j |j d |j d}n|jd kr|jd krt|j |j |j |j d |j d}n|jd kr|jdkrt|j |j |j |j d|j d}nR|jdkrt|j |j |j |j d|j d}n(t|j |j |j |j d|j dtdd}||jdkr<||7}q ||jdkrTtdd}td|||jdkrtd||||}|sd}|d|}tj|rt|}||}|r||t|dnt|d|d}||7}qb|S)NirzLFATAL ERROR: Time slice resolution must divide 60 minutes with no remainder.rr6rF%&4-)hoursrz+FATAL ERROR: observation time period wrong!zTimeslice start time: zmaking time slice for TrHz updated!z not updated!)secondsrNrrOr"r#r$rminuteyearmonthdayhourrrVr isoformatrbZisEmptyZgetSliceNCFileNamerKrLisfilerZ fromNetCDFZmergeOldZtoNetCDF) r,raoutdirZ startTimecountZoneSliceZ updatedOrNewZ slicefilenameZoldslicer1r1r2makeAllTimeSlicesZsz              z&All_WSC_Observations.makeAllTimeSlicesN) rArBrCrDr3r\rr_rbrxr1r1r1r2rEs(  rE)rKsystimerstringrrxml.etree.ElementTreeetree ElementTreerr#rrrEr1r1r1r2s   |