Changeset 2158 in lmdz_wrf


Ignore:
Timestamp:
Oct 4, 2018, 1:17:56 PM (6 years ago)
Author:
lfita
Message:

Adding:

  • 'CFtimesvar_datetime': Provide date/time array from a CF-compilant time variable
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/generic_tools.py

    r2154 r2158  
    7070# CFmonthU_daysU: Function to transform from a CF date series with units as 'months since [DATE]' to 'days since [DATE]'
    7171# 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
    7274# CFvar_DIAGvar: Function to provide which model diagnostic values can provide a CF-variable from ASCII file
    7375# CFvar_MODvar: Function to provide which model values can provide a CF-variable from ASCII file
     
    31453147    return realdates
    31463148
     3149def 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
    31473298class statsValWeigthed(object):
    31483299  """Weigthed Statistics class providing:
     
    1387614027#print WRF_percenlevels(38)
    1387714028
     14029def 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
     14095tv = []
     14096for it in range(0,10):
     14097    tv.append(it*365)
     14098    tv.append(it*365+180.)
     14099    tv.append(it*365+360.)
     14100
     14101tu = 'days since 1949-12-01 00:00:00'
     14102per = 'year'
     14103calend = 'standard'
     14104amount = 1
     14105
     14106time_slices(tv, tu, calend, per, amount)
     14107
    1387814108#quit()
    1387914109
Note: See TracChangeset for help on using the changeset viewer.