Changeset 2158 in lmdz_wrf
- Timestamp:
- Oct 4, 2018, 1:17:56 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/generic_tools.py
r2154 r2158 70 70 # CFmonthU_daysU: Function to transform from a CF date series with units as 'months since [DATE]' to 'days since [DATE]' 71 71 # CFtime_freq: Function to provide the frequency of CF times (in seconds) 72 # CFtimes_datetime: Provide date/time array from a file with a series of netCDF CF-compilant time variable 73 # CFtimesvar_datetime: Provide date/time array from a CF-compilant time variable 72 74 # CFvar_DIAGvar: Function to provide which model diagnostic values can provide a CF-variable from ASCII file 73 75 # CFvar_MODvar: Function to provide which model values can provide a CF-variable from ASCII file … … 3145 3147 return realdates 3146 3148 3149 def CFtimesvar_datetime(times, units, calendar): 3150 """ Provide date/time array from a CF-compilant time variable 3151 timevals = CF values of the variable time 3152 units = CF-compilant units ([Tunit] since [date]) of timevals 3153 calendar= calendar of the time values 3154 'earth_360d', '360d', '360days', '360_day' any of them for years of 360 days 3155 output: 3156 array(dimt, 0) = year 3157 array(dimt, 1) = month 3158 array(dimt, 2) = day 3159 array(dimt, 3) = hour 3160 array(dimt, 4) = minute 3161 array(dimt, 5) = second 3162 """ 3163 import datetime as dt 3164 fname = 'CFtimesvar_datetime' 3165 3166 txtunits = units.split(' ') 3167 tunits = txtunits[0] 3168 Srefdate = txtunits[len(txtunits) - 1] 3169 # Does reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS] 3170 ## 3171 timeval = Srefdate.find(':') 3172 if not timeval == -1: 3173 # print ' refdate with time!' 3174 refdate = datetimeStr_datetime(txtunits[len(txtunits) - 2] + '_' + Srefdate) 3175 else: 3176 refdate = dateStr_date(Srefdate) 3177 3178 dimt = len(times) 3179 realdates = np.zeros((dimt, 6), dtype=int) 3180 3181 secsDay=3600*24. 3182 3183 # Checking calendar! 3184 ## 3185 y360 = False 3186 daycal360 = ['earth_360d', '360d', '360days', '360_day'] 3187 if searchInlist(daycal360,calendar): 3188 print warnmsg 3189 print ' ' + fname + ': calendar of 12 months of 30 days !!' 3190 y360 = True 3191 3192 ## Not in timedelta 3193 # if tunits == 'years': 3194 # for it in range(dimt): 3195 # realdate = refdate + dt.timedelta(years=float(times[it])) 3196 # realdates[it] = int(realdate.year) 3197 # elif tunits == 'months': 3198 # for it in range(dimt): 3199 # realdate = refdate + dt.timedelta(months=float(times[it])) 3200 # realdates[it] = int(realdate.year) 3201 if y360: 3202 if tunits == 'weeks': 3203 for it in range(dimt): 3204 deltat = dt.timedelta(weeks=float(times[it])) 3205 Tsecs = deltat.days*secsDay + deltat.seconds + deltat.microseconds/1000. 3206 realdates[it,:] = date_juliandate(refdate.year,Tsecs) 3207 elif tunits == 'days': 3208 for it in range(dimt): 3209 deltat = dt.timedelta(days=float(times[it])) 3210 Tsecs = deltat.days*secsDay + deltat.seconds + deltat.microseconds/1000. 3211 realdates[it,:] = date_juliandate(refdate.year,Tsecs) 3212 elif tunits == 'hours': 3213 for it in range(dimt): 3214 realdate = dt.timedelta(hours=float(times[it])) 3215 Tsecs = deltat.days*secsDay + deltat.seconds + deltat.microseconds/1000. 3216 realdates[it,:] = date_juliandate(refdate.year,Tsecs) 3217 elif tunits == 'minutes': 3218 for it in range(dimt): 3219 realdate = dt.timedelta(minutes=float(times[it])) 3220 Tsecs = deltat.days*secsDay + deltat.seconds + deltat.microseconds/1000. 3221 realdates[it,:] = date_juliandate(refdate.year,Tsecs) 3222 elif tunits == 'seconds': 3223 for it in range(dimt): 3224 realdate = dt.timedelta(seconds=float(times[it])) 3225 Tsecs = deltat.days*secsDay + deltat.seconds + deltat.microseconds/1000. 3226 realdates[it,:] = date_juliandate(refdate.year,Tsecs) 3227 elif tunits == 'miliseconds': 3228 for it in range(dimt): 3229 realdate = dt.timedelta(miliseconds=float(times[it])) 3230 Tsecs = deltat.days*secsDay + deltat.seconds + deltat.microseconds/1000. 3231 realdates[it,:] = date_juliandate(refdate.year,Tsecs) 3232 else: 3233 print errormsg 3234 print ' CFtimes_datetime: time units "' + tunits + '" not ready!!!!' 3235 quit(-1) 3236 else: 3237 if tunits == 'weeks': 3238 for it in range(dimt): 3239 realdate = refdate + dt.timedelta(weeks=float(times[it])) 3240 realdates[it,0] = int(realdate.year) 3241 realdates[it,1] = int(realdate.month) 3242 realdates[it,2] = int(realdate.day) 3243 realdates[it,3] = int(realdate.hour) 3244 realdates[it,4] = int(realdate.second) 3245 realdates[it,5] = int(realdate.minute) 3246 elif tunits == 'days': 3247 for it in range(dimt): 3248 realdate = refdate + dt.timedelta(days=float(times[it])) 3249 realdates[it,0] = int(realdate.year) 3250 realdates[it,1] = int(realdate.month) 3251 realdates[it,2] = int(realdate.day) 3252 realdates[it,3] = int(realdate.hour) 3253 realdates[it,4] = int(realdate.second) 3254 realdates[it,5] = int(realdate.minute) 3255 elif tunits == 'hours': 3256 for it in range(dimt): 3257 realdate = refdate + dt.timedelta(hours=float(times[it])) 3258 realdates[it,0] = int(realdate.year) 3259 realdates[it,1] = int(realdate.month) 3260 realdates[it,2] = int(realdate.day) 3261 realdates[it,3] = int(realdate.hour) 3262 realdates[it,4] = int(realdate.second) 3263 realdates[it,5] = int(realdate.minute) 3264 elif tunits == 'minutes': 3265 for it in range(dimt): 3266 realdate = refdate + dt.timedelta(minutes=float(times[it])) 3267 realdates[it,0] = int(realdate.year) 3268 realdates[it,1] = int(realdate.month) 3269 realdates[it,2] = int(realdate.day) 3270 realdates[it,3] = int(realdate.hour) 3271 realdates[it,4] = int(realdate.second) 3272 realdates[it,5] = int(realdate.minute) 3273 elif tunits == 'seconds': 3274 for it in range(dimt): 3275 realdate = refdate + dt.timedelta(seconds=float(times[it])) 3276 realdates[it,0] = int(realdate.year) 3277 realdates[it,1] = int(realdate.month) 3278 realdates[it,2] = int(realdate.day) 3279 realdates[it,3] = int(realdate.hour) 3280 realdates[it,4] = int(realdate.second) 3281 realdates[it,5] = int(realdate.minute) 3282 elif tunits == 'milliseconds': 3283 for it in range(dimt): 3284 realdate = refdate + dt.timedelta(milliseconds=float(times[it])) 3285 realdates[it,0] = int(realdate.year) 3286 realdates[it,1] = int(realdate.month) 3287 realdates[it,2] = int(realdate.day) 3288 realdates[it,3] = int(realdate.hour) 3289 realdates[it,4] = int(realdate.second) 3290 realdates[it,5] = int(realdate.minute) 3291 else: 3292 print errormsg 3293 print ' CFtimes_datetime: time units "' + tunits + '" not ready!!!!' 3294 quit(-1) 3295 3296 return realdates 3297 3147 3298 class statsValWeigthed(object): 3148 3299 """Weigthed Statistics class providing: … … 13876 14027 #print WRF_percenlevels(38) 13877 14028 14029 def time_slices(tv, tu, cal, per, amount): 14030 """ Function to return temporal slices of a series of times for a given amount 14031 of periods 14032 tv: time vallues (CF format) 14033 tu: CF time-units 14034 cal: calendar 14035 per: period 14036 'year': full year [01/01 00:00:00 - 12/31 23:59:59] 14037 'month': full months [01 00:00:00 - [31,30,28/29] 23:59:59] 14038 'day': full days [00:00:00 - 23:59:59] 14039 'hour': full hours [00:00 - 59:59] 14040 'minute': full minutes [00 - 59] 14041 amount: amount of periods 14042 """ 14043 import datetime as dt 14044 fname = 'time_slices' 14045 14046 mattimes = CFtimesvar_datetime(tv, tu, cal) 14047 print 'CF times _______' 14048 print mattimes 14049 14050 if type(tv) == type(np.arange(2)): 14051 dimt = tv.shape[0] 14052 elif type(tv) == type(range(2)): 14053 dimt = len(tv) 14054 else: 14055 print errormsg 14056 print ' ' + fname + ': time values type ', type(tv), 'not ready !!' 14057 print ' available ones:', type(np.arange(1)), type(range(2)) 14058 quit(-1) 14059 14060 slices = [] 14061 if per == 'year': 14062 imat = 0 14063 # Getting unique values 14064 years = list(mattimes[:,imat]) 14065 setvar = set(years) 14066 utimes = list(setvar) 14067 Nutimes = len(utimes) 14068 14069 # introducing amounts 14070 print utimes, ':', Nutimes 14071 atimes = np.arange(utimes[0], utimes[Nutimes-1], amount) 14072 Ntimes = len(atimes) 14073 14074 itt = 0 14075 for iat in range(Ntimes-1): 14076 # timeslice: [ini_slice, end_slice, freq_slice] 14077 timeslice = [itt,itt,1] 14078 ip = atimes[iat] 14079 ep = atimes[iat+1] 14080 14081 for it in range(itt,dimt): 14082 if mattimes[it,imat] >= ip and mattimes[it,imat] < ep: 14083 timeslice[1] = it 14084 else: 14085 slices.append(timeslice) 14086 itt = it + 0 14087 break 14088 14089 Nslices = len(slices) 14090 for isl in range(Nslices): 14091 print atimes[isl], atimes[isl+1], ':', slices[isl] 14092 14093 return slices 14094 14095 tv = [] 14096 for it in range(0,10): 14097 tv.append(it*365) 14098 tv.append(it*365+180.) 14099 tv.append(it*365+360.) 14100 14101 tu = 'days since 1949-12-01 00:00:00' 14102 per = 'year' 14103 calend = 'standard' 14104 amount = 1 14105 14106 time_slices(tv, tu, calend, per, amount) 14107 13878 14108 #quit() 13879 14109
Note: See TracChangeset
for help on using the changeset viewer.