U g:@stddlZddlZddlZddlZddlTddlmZmZddlZddlZddl Z d ddZ dd Z Gd d d Z dS) N)*)datetime timedelta& .>cCsz|dks|dkrtd||kr$dSt|s8t|rUszdict_compare..)setkeys intersectiondictr) rrZd1_keysZd2_keysZintersect_keysaddedremovedmodifiedrsamerrr dict_compareIs   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$USACE station identifer of length 15ZUTCzYYYY-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__kszTimeSlice.__init__cCs|j S)z[ Test if the time slice is empty Return: boolean )r))r*rrrisEmptywszTimeSlice.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*ZstationLr0sirrr getStationIDss zTimeSlice.getStationIDscCs"g}|jD]}||dq |S)zz Get all stream flow values of the time slice Return: list of flow values rr)r3)r*valuesr0rrrgetDischargeValuess 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)r3r4strftime)r*Zobvtimesr0rrrgetDischargeTimess  zTimeSlice.getDischargeTimescCs,g}|jD]}|t|dq |S)zs Get all query times of the time slice Return: list of query times r)r)r3calendarZtimegm utctimetuple)r*Zqtimesr0rrr getQueryTimess zTimeSlice.getQueryTimesusaceTimeSlice.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'r@strintr(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*Zdqr0rrrgetDischargeQualitys 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)formatr6 stationIdIndN timeStrLen stationIdZS1)rVr6r&) long_nameunitstime)rVrW dischargeZf4)rVdischarge_qualityZi2z0.01)rYrZZ multfactor queryTimeZi4rZz*seconds since 1970-01-01 00:00:00 local TZr?rFrGr)ZfileUpdateTimeUTCsliceCenterTimeUTCsliceTimeResolutionMinutes)netCDF4DatasetrOZcreateDimensionr6rWZcreateVariableZ setncattsstationIdLong_name timeLong_nametimeUnitdischargeLong_name dischargeUnitdischargeQualaityLong_namedischargeQualityUnitrutcnowr@r'rHrIr(rJrKrLr>rDr;rArQclose) r* outputdirrMnc_fidrXr[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 rr_r?r`)minutesrXNr\r^r])rarbrstrptimeZ getncattrrrIZ chartostringZ variableszipr3striputcfromtimestamprk)r*Z ncfilenamerm timestampZ time_resolrnr\r^ZqualityZstationTimeValuer9dqZqualrrr 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 ...rrrPrFTN)r'r( RuntimeErrorrr)r"updater3) r*Z oldTimeSliceZsite_time_valuer0Zold_site_time_valuerrr r!ZsiterrrmergeOldAs2            zTimeSlice.mergeOldN)rE)rRrE)__name__ __module__ __qualname____doc__r6rcrWrerdrgrfrirhr,r-r1r;r>rArDrOrQro classmethodryr|rrrrr#Xs0      C +r#)rr)ossysr[rstringrrrBraZnumpyZnprr"r#rrrrs  '