U g:@stddlZddlZddlZddlZddlTddlmZmZddlZddlZddl Z d ddZ dd Z Gd d d Z dS) N)*)datetime timedelta& .>cCsz|dks|dkrtd||kr$dSt|s8t|rTszdict_compare..)setkeys intersectiondictr) rrZd1_keysZd2_keysZintersect_keysaddedremovedmodifiedrsamerrr dict_compareHs   r"c@seZdZdZdZdZdZdZdZdZ dZ d Z d Z d d Z d dZddZddZddZddZddZd&ddZddZd'dd Zed!d"Zd#d$Zd%S)( TimeSlicez Description: Store one time slice data Author: Zhengtao Cui (Zhengtao.Cui@noaa.gov) Date: Aug. 26, 2015 Date modified: Oct. 20, 2015, Fixed bugs in mergeOld. z#USGS station identifer of length 15UTCzYYYY-MM-DD_HH:mm:ss UTCzm^3/sz!Discharge.cubic_meters_per_second-z/Discharge quality 0 to 100 to be scaled by 100.cCs||_||_||_dS)a+ Initialize a TimeSlice object Input: time_stamp - a time stamp resolution - time resolution of the time slices station_time_value - Tuple of (station, time, flow, quality) N)centralTimeStampsliceTimeResolutionobvStationTimeValue)selfZ time_stamp resolutionZstation_time_valuerrr__init__jszTimeSlice.__init__cCs|j S)z[ Test if the time slice is empty Return: boolean )r*)r+rrrisEmptyvszTimeSlice.isEmptycCs6|jD]*}td|j|d|d|dqdS)z> Print the time slice data zSlice: central time: rrrN)r*printr( isoformat)r+errrprint_station_time_value}s  z"TimeSlice.print_station_time_valuecCsg}|jD]}|t|dq |D]V}t||jkr\tt||jD]}|ddqHq&t||jkr&|d|jd}q&|S)zt Get all station ids of the time slices Return: list of station ids r r)r*appendlistlenstationIdStrLenrangeinsert)r+ZstationLr1sirrr getStationIDss zTimeSlice.getStationIDscCs"g}|jD]}||dq |S)zz Get all stream flow values of the time slice Return: list of flow values rr*r4)r+valuesr1rrrgetDischargeValuess zTimeSlice.getDischargeValuescCs,g}|jD]}|t|ddq |S)z Get all observation times of the time slice Return: list of observation times r%Y-%m-%d_%H:%M:00)r*r4r5strftime)r+Zobvtimesr1rrrgetDischargeTimess  zTimeSlice.getDischargeTimescCs,g}|jD]}|t|dq |S)zs Get all query times of the time slice Return: list of query times r)r*r4calendartimegm utctimetuple)r+Zqtimesr1rrr getQueryTimess zTimeSlice.getQueryTimesusgsTimeSlice.ncdfcCsB|jdtt|jjdd|jjddd|}|S)zg Get NetCDF file for this time slice Return: A NetCDF filename z%Y-%m-%d_%H:%M:00.<rzmin.)r(rAstrintr)dayssecondszfill)r+suffixfilenamerrrgetSliceNCFileNames  zTimeSlice.getSliceNCFileNamecCs"g}|jD]}||dq |S)z} Get discharge quality for this time slice Return: A list of discharge quality r=)r+Zdqr1rrrgetDischargeQualitys zTimeSlice.getDischargeQuality./c Cstj|d||ddd}|d|j|dd|d|j|d d d }||jd d |dd d}||j |j d |ddd}||j |j d |ddd}||j |jdd|ddd}|ddi|td|jdtt|jjdd|jjddd||dd<||dd<|} | |dd<||dd<||dd<|dS) z Write the time slice to a NetCDF file Input: outputdir - the directory where to write the NetCDF /wZNETCDF4)formatr7 stationIdIndN timeStrLen stationIdZS1)rXr7r') long_nameunitstime)rXrY dischargeZf4)rXdischarge_qualityZi2z0.01)r[r\Z multfactor queryTimeZi4r\z*seconds since 1970-01-01 00:00:00 local TZr@rHrIr)ZfileUpdateTimeUTCsliceCenterTimeUTCsliceTimeResolutionMinutes)netCDF4DatasetrQZcreateDimensionr7rYZcreateVariableZ setncattsstationIdLong_name timeLong_nametimeUnitdischargeLong_name dischargeUnitdischargeQualaityLong_namedischargeQualityUnitrutcnowrAr(rJrKr)rLrMrNr?rFr<rBrSclose) r+ outputdirrOnc_fidrZr]r^r_r`stationsrrrtoNetCDFsv      zTimeSlice.toNetCDFcCst|d}t|dd}tt|dd}t|jddd}|jddd}|jd dd}|jd dd}g} t ||||D](\} } } } | | t | | | fq| |||| S) zx Read the time slice from a NetCDF file Input: ncfilename - the NetCDF filename rrar@rb)minutesrZNr^r`r_)rcrdrstrptimeZ getncattrrrKZ chartostringZ variableszipr4striputcfromtimestamprm)r+Z ncfilenamero timestampZ time_resolrpr^r`ZqualityZstationTimeValuer:dqZqualrrr fromNetCDFs2   zTimeSlice.fromNetCDFc Cs|j|jks|j|jkr"tdnt}|jD]"}|d|d|df||d<q.t}|jD]"}|d|d|df||d<q^t||\}}}}|s|sdS||g|_|D]0} |j| || d|| d|| dfqdSdS) z Merge data in an existing NetCDF time slice file with this one Input: oldTimeSlice - the NetCDF filename of the existing time slice z9FATAL ERROR: the two time slices differ, not merging ...rrrRrFTN)r(r) RuntimeErrorrr*r"updater4) r+Z oldTimeSliceZsite_time_valuer1Zold_site_time_valuerrr r!ZsiterrrmergeOld@s2            zTimeSlice.mergeOldN)rG)rTrG)__name__ __module__ __qualname____doc__r7rerYrgrfrirhrkrjr-r.r2r<r?rBrFrQrSrq classmethodr{r~rrrrr#Ws0      C +r#)rr)ossysr]rstringrrrCrcZnumpyZnprr"r#rrrrs  '