Changeset 1357 in lmdz_wrf for trunk


Ignore:
Timestamp:
Nov 28, 2016, 4:16:32 PM (9 years ago)
Author:
lfita
Message:

Setting a `quitval' (default=True) value on 'same_shape' in order to decide to quit or not when 'error' occurs
Setting a `quitval' (default=True) value on 'index_mat' in order to decide to quit or not when 'value is not in matrix'
Adding `cfTime' as possible 'typeSo' in 'datetimeStr_conversion'

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/generic_tools.py

    r1330 r1357  
    369369    return combos
    370370
     371def datetimeStr_datetime(StringDT):
     372    """ Function to transform a string date ([YYYY]-[MM]-[DD]_[HH]:[MI]:[SS] format) to a date object
     373    >>> datetimeStr_datetime('1976-02-17_00:00:00')
     374    1976-02-17 00:00:00
     375    """
     376    import datetime as dt
     377
     378    fname = 'datetimeStr_datetime'
     379
     380    dateD = np.zeros((3), dtype=int)
     381    timeT = np.zeros((3), dtype=int)
     382
     383    dateD[0] = int(StringDT[0:4])
     384    dateD[1] = int(StringDT[5:7])
     385    dateD[2] = int(StringDT[8:10])
     386
     387    trefT = StringDT.find(':')
     388    if not trefT == -1:
     389#        print '  ' + fname + ': refdate with time!'
     390        timeT[0] = int(StringDT[11:13])
     391        timeT[1] = int(StringDT[14:16])
     392        timeT[2] = int(StringDT[17:19])
     393
     394    if int(dateD[0]) == 0:
     395        print warnmsg
     396        print '    ' + fname + ': 0 reference year!! changing to 1'
     397        dateD[0] = 1
     398 
     399    newdatetime = dt.datetime(dateD[0], dateD[1], dateD[2], timeT[0], timeT[1], timeT[2])
     400
     401    return newdatetime
     402
    371403def datetimeStr_conversion(StringDT,typeSi,typeSo):
    372404    """ Function to transform a string date to an another date object
     
    375407    typeSo= type of datetime string output
    376408      [typeSi/o]
    377         'cfTime': [time],[units]; ]time in CF-convention format [units] = [tunits] since [refdate]
     409        'cfTime',[units]: time in CF-convention format [units] = [tunits] since [refdate]
    378410        'matYmdHMS': numerical vector with [[YYYY], [MM], [DD], [HH], [MI], [SS]]
    379411        'YmdHMS': [YYYY][MM][DD][HH][MI][SS] format
     
    385417    >>> datetimeStr_conversion('1976-02-17_08:32:05','Y-m-d_H:M:S','matYmdHMS')
    386418    [1976    2   17    8   32    5]
    387     >>> datetimeStr_conversion(str(137880)+',minutes since 1979-12-01_00:00:00','cfTime','Y/m/d H-M-S')
     419    >>> datetimeStr_conversion(str(137880),'cfTime,minutes since 1979-12-01_00:00:00','Y/m/d H-M-S')
    388420    1980/03/05 18-00-00
     421    >>> datetimeStr_conversion('1980/03/05 18-00-00','Y/m/d H-M-S','cfTime,minutes since 1979-12-01_00:00:00')
     422    137880.0
    389423    """
    390424    import datetime as dt
     
    397431        quit()
    398432
    399     if typeSi == 'cfTime':
    400         timeval = np.float(StringDT.split(',')[0])
    401         tunits = StringDT.split(',')[1].split(' ')[0]
    402         Srefdate = StringDT.split(',')[1].split(' ')[2]
     433    if typeSi[0:6] == 'cfTime':
     434        timeval = np.float(StringDT)
     435        tunits = typeSi.split(',')[1].split(' ')[0]
     436        Srefdate = typeSi.split(',')[1].split(' ')[2]
    403437
    404438# Does reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]
     
    408442        dayref=Srefdate[8:10]
    409443
    410         trefT = Srefdate.find(':')
     444        trefT = typeSi.split(',')[1].find(':')
    411445        if not trefT == -1:
    412 #            print '  ' + fname + ': refdate with time!'
    413             horref=Srefdate[11:13]
    414             minref=Srefdate[14:16]
    415             secref=Srefdate[17:19]
     446            if len(typeSi.split(',')[1].split(' ')) == 3:
     447                horref=Srefdate[11:13]
     448                minref=Srefdate[14:16]
     449                secref=Srefdate[17:19]
     450            else:
     451                Sreftime = typeSi.split(',')[1].split(' ')[3]
     452                horref=Sreftime[0:2]
     453                minref=Sreftime[3:5]
     454                secref=Sreftime[6:8]               
    416455            refdate = datetimeStr_datetime( yrref + '-' + monref + '-' + dayref +    \
    417456              '_' + horref + ':' + minref + ':' + secref)
     
    501540        quit(-1)
    502541
    503     if typeSo == 'matYmdHMS':
     542    if typeSo[0:6] == 'cfTime':
     543        tunits = typeSo.split(',')[1].split(' ')[0]
     544        Srefdate = typeSo.split(',')[1].split(' ')[2]
     545
     546# Does reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]
     547##
     548        yrref=Srefdate[0:4]
     549        monref=Srefdate[5:7]
     550        dayref=Srefdate[8:10]
     551
     552        trefT = typeSo.split(',')[1].find(':')
     553        if not trefT == -1:
     554#            print '  ' + fname + ': refdate with time!'
     555            if len(typeSo.split(',')[1].split(' ')) == 3:
     556                horref=Srefdate[11:13]
     557                minref=Srefdate[14:16]
     558                secref=Srefdate[17:19]
     559            else:
     560                Sreftime = typeSo.split(',')[1].split(' ')[3]
     561                horref=Sreftime[0:2]
     562                minref=Sreftime[3:5]
     563                secref=Sreftime[6:8]               
     564
     565            refdate = datetimeStr_datetime( yrref + '-' + monref + '-' + dayref +    \
     566              '_' + horref + ':' + minref + ':' + secref)
     567        else:
     568            refdate = datetimeStr_datetime( yrref + '-' + monref + '-' + dayref +    \
     569              + '_00:00:00')
     570        datei = dt.datetime(yr, mo, da, ho, mi, se)
     571        difft = datei - refdate
     572
     573        if searchInlist(dir(difft),'total_seconds'):
     574            totsecs = difft.total_seconds()
     575        else:
     576            totsecs = difft.days()*24*3600. + difft.seconds()
     577
     578        if tunits == 'weeks':
     579            cfdt = totsecs / (7*24*3600)
     580        elif tunits == 'days':
     581            cfdt = totsecs / (24*3600)
     582        elif tunits == 'hours':
     583            cfdt = totsecs / (3600)
     584        elif tunits == 'minutes':
     585            cfdt = totsecs / (60)
     586        elif tunits == 'seconds':
     587            cfdt = totsecs
     588        elif tunits == 'milliseconds':
     589            cfdt = totsecs*100.
     590        else:
     591              print errormsg
     592              print '    timeref_datetime: time units "' + tunits + '" not ready!!!!'
     593              quit(-1)
     594        dateYmdHMS = cfdt
     595       
     596    elif typeSo == 'matYmdHMS':
    504597        dateYmdHMS = np.zeros((6), dtype=int)
    505598        dateYmdHMS[0] =  yr
     
    21342227    return valpos
    21352228
    2136 def index_mat(mat,val):
     2229def index_mat(mat,val,quitval=True):
    21372230    """ Function to provide the coordinates of a given value inside a matrix
    21382231    index_mat(mat,val)
    21392232      mat= matrix with values
    21402233      val= value to search
     2234      quitval= Whether one should arise quit signal in case no grid-point is found
    21412235    >>> index_mat(np.arange(27).reshape(3,3,3),22)
    21422236    [2 1 1]
    21432237    """
    2144 
    21452238    fname = 'index_mat'
    21462239
     
    21482241
    21492242    matlist = list(mat.flatten())
     2243
     2244    # From: https://www.google.com.ar/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwj30JLKjMfQAhUEthoKHVAkAwoQFggtMAI&url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F7571635%2Ffastest-way-to-check-if-a-value-exist-in-a-list&usg=AFQjCNFboI4YVafR26qSpyj5zx5GrQ3LGQ&bvm=bv.139782543,d.d2s
     2245    if not val in matlist:
     2246        print errormsg
     2247        print '  ' + fname + ': matrix does not content ', val,' !!'
     2248        if quitval:
     2249            quit(-1)
     2250        else:
     2251            return -1
    21502252    ifound = matlist.index(val)
    21512253
     
    23852487    else:
    23862488      return end
    2387 
    2388 def datetimeStr_datetime(StringDT):
    2389     """ Function to transform a string date ([YYYY]-[MM]-[DD]_[HH]:[MI]:[SS] format) to a date object
    2390     >>> datetimeStr_datetime('1976-02-17_00:00:00')
    2391     1976-02-17 00:00:00
    2392     """
    2393     import datetime as dt
    2394 
    2395     fname = 'datetimeStr_datetime'
    2396 
    2397     dateD = np.zeros((3), dtype=int)
    2398     timeT = np.zeros((3), dtype=int)
    2399 
    2400     dateD[0] = int(StringDT[0:4])
    2401     dateD[1] = int(StringDT[5:7])
    2402     dateD[2] = int(StringDT[8:10])
    2403 
    2404     trefT = StringDT.find(':')
    2405     if not trefT == -1:
    2406 #        print '  ' + fname + ': refdate with time!'
    2407         timeT[0] = int(StringDT[11:13])
    2408         timeT[1] = int(StringDT[14:16])
    2409         timeT[2] = int(StringDT[17:19])
    2410 
    2411     if int(dateD[0]) == 0:
    2412         print warnmsg
    2413         print '    ' + fname + ': 0 reference year!! changing to 1'
    2414         dateD[0] = 1
    2415  
    2416     newdatetime = dt.datetime(dateD[0], dateD[1], dateD[2], timeT[0], timeT[1], timeT[2])
    2417 
    2418     return newdatetime
    24192489
    24202490def dateStr_date(StringDate):
     
    37743844
    37753845class Quantiles(object):
    3776     """ Class to provide quantiles from a given arrayof values
     3846    """ Class to provide quantiles from a given array of values
    37773847    """
    37783848
     
    92299299    return tB
    92309300
    9231 def same_shape(mat1,mat2):
     9301def same_shape(mat1,mat2,quitval=True):
    92329302    """ Function to check if two matrices have the same shape
    92339303      mat1,2= matrices to check
    92349304    """
    92359305    fname = 'same_shape'
     9306
     9307    same = True
    92369308
    92379309    shape1 = mat1.shape
     
    92469318        print '    Ndims mat 1:', Ndims1,' Ndims mat2:', Ndims2
    92479319        print '    shape mat 1:', shape1, 'mat 2:', shape2
    9248         quit(-1)
     9320        same = False
     9321        if quitval: quit(-1)
    92499322
    92509323    for idn in range(Ndims1):
     
    92549327            print '    Length mat 1:', shape1[idn],' Length mat2:', shape2[idn]
    92559328            print '    shape mat 1:', shape1, 'mat 2:', shape2
    9256             quit(-1)
    9257 
    9258     return
     9329            same = False
     9330            if quitval: quit(-1)
     9331   
     9332    return same
    92599333
    92609334def index_flatten_mat(index,Ldims):
Note: See TracChangeset for help on using the changeset viewer.