Changeset 2477 in lmdz_wrf


Ignore:
Timestamp:
Apr 29, 2019, 4:27:12 PM (6 years ago)
Author:
lfita
Message:

Adding:

  • `from360d_reg': Function to transform from 360d = 12 * 30d calendar to a regular one
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/generic_tools.py

    r2476 r2477  
    551551###
    552552#
     553def fromanydate_CFYmd(date):
     554    """ Function to transform from any string format of date to Y-m-d used in
     555        CF-conventions
     556      date: date to transform
     557    >>> fromanydate_CFYmd('0001-01-01')
     558    '0001-01-01'
     559    >>> fromanydate_CFYmd('1850-1-1')
     560    '1850-01-01'
     561    >>> fromanydate_CFYmd('1850/1/1')
     562    '1850-01-01'
     563    >>> fromanydate_CFYmd('1976-02-17_08:32:27')
     564    '1976-02-17'
     565    """
     566    fname = 'fromanydate_CFYmd'
     567
     568    if date.count('-') + date.count('/') == 0 + date.count('.') == 0:
     569        print errormsg
     570        print '  ' + fname + ": date without either '-' or '/' or '.' not ready !!"
     571        print "    passed date '" + date + "' not manegeable"
     572        quit(-1)
     573
     574    # Replacing '/', '.' by '-'
     575    if date.count('/') != 0: date = date.replace('/','-')
     576    if date.count('.') != 0: date = date.replace('.','-')
     577
     578    # Removing possible [datre]_[time]
     579    if date.count('_') != 0: date = date.split('_')[0]
     580
     581    ldate = date.split('-')
     582    if len(ldate) != 3:
     583        print errormsg
     584        print '  ' + fname + ": date '" + date + "' not ready !!"
     585        print "     it requires 3 '-' sections '[yr]-[mo]-[dd]'"
     586        quit(-1)
     587
     588    yr = str(int(ldate[0])).zfill(4)
     589    mo = str(int(ldate[1])).zfill(2)
     590    dd = str(int(ldate[2])).zfill(2)
     591
     592    newdate = yr + '-' + mo + '-' + dd
     593
     594    return newdate
     595
     596class CFtimeU_inf(object):
     597    """ Classs to provide information of CFtime units
     598      cftimeu: CF time units to provide information for [Timeu] since [RefDate]
     599      * attributes:
     600        refdate: reference date in Y-m-d H:M:S format
     601        refdateYMHdms = reference date in YmdHMS format
     602        refdatemat = reference date in matricial format
     603        refdatejuliand = reference date as julian date (days since -4712 January 1st
     604          00 UTC)
     605        refdateDT = reference date as datetime object
     606        Tunits = origtunits
     607        utoweeks = Factor to convert values from original temporal units to weeks
     608        utodays = Factor to convert values from original temporal units to days
     609        utohours = Factor to convert values from original temporal units to hours
     610        utominutes = Factor to convert values from original temporal units to minutes
     611        utoseconds = Factor to convert values from original temporal units to seconds
     612    """
     613
     614    def __init__(self, cftimeu):
     615        import datetime as dt
     616        fname = 'CFtimeU_inf'
     617
     618        availtu = ['weeks', 'days', 'hours', 'minutes', 'seconds']
     619
     620        origtv = cftimeu.split(' ')
     621        origtunits = origtv[0]
     622        origSrefdate0 = origtv[2]
     623
     624        origSrefdate = fromanydate_CFYmd(origSrefdate0)
     625
     626        yrref = int(origSrefdate[0:4])
     627        monref = int(origSrefdate[5:7])
     628        dayref = int(origSrefdate[8:10])
     629
     630# Does original reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]
     631##
     632        trefT = cftimeu.find(':')
     633        if not trefT == -1:
     634            if len(origtv) == 3:
     635                horref=int(origSrefdate[11:13])
     636                minref=int(origSrefdate[14:16])
     637                secref=int(origSrefdate[17:19])
     638            else:
     639                origSreftime = origtv[3]
     640                horref=int(origSreftime[0:2])
     641                minref=int(origSreftime[3:5])
     642                secref=int(origSreftime[6:8])
     643        else:
     644            horref = 0
     645            minref = 0
     646            secref = 0
     647
     648        horrefS = str(horref).zfill(2)
     649        minrefS = str(minref).zfill(2)
     650        secrefS = str(secref).zfill(2)
     651
     652        # Transforming factors
     653        if origtunits == 'weeks':
     654            self.utoweeks = 1.
     655            self.utodays = 7.
     656            self.utohours = 7. * 24.
     657            self.utominutes = 7. * 24. * 60.
     658            self.utoseconds = 7. * 24. * 3600.
     659        elif origtunits == 'days':
     660            self.utoweeks = 1. / 7.
     661            self.utodays = 1.
     662            self.utohours = 24.
     663            self.utominutes = 24. * 60.
     664            self.utoseconds = 24. * 3600.
     665        elif origtunits == 'hours':
     666            self.utoweeks = 1. / ( 7. * 24.)
     667            self.utodays = 1. / 24.
     668            self.utohours = 1.
     669            self.utominutes = 60.
     670            self.utoseconds = 3600.
     671        elif origtunits == 'minutes':
     672            self.utoweeks = 1. / ( 7. * 24. * 60.)
     673            self.utodays = 1. / ( 24. * 60.)
     674            self.utohours = 1. / 60.
     675            self.utominutes = 1.
     676            self.utoseconds = 60.
     677        elif origtunits == 'seconds':
     678            self.utoweeks = 1. / ( 7. * 24. * 3600.)
     679            self.utodays = 1. / ( 24. * 3600.)
     680            self.utohours = 1. / 3600.
     681            self.utominutes = 1. / 60.
     682            self.utoseconds = 1.
     683        else:
     684            print errormsg
     685            print '  ' + fname + ": new time-units '" + origtunits + "' not ready !!"
     686            print '    available ones: ', availtu
     687            quit(-1)
     688
     689        self.refdate = origSrefdate + ' ' + horrefS + ':' + minrefS + ':' + secrefS
     690        self.refdateYMHdms = origSrefdate[0:4] + origSrefdate[5:7] +                 \
     691          origSrefdate[8:10] + horrefS + ':' + minrefS + ':' + secrefS
     692        self.refdatemat = [yrref, monref, dayref, horref, minref, secref]
     693        self.refdatejuliand = juliandate(yrref,monref,dayref,horref,minref,secref)
     694        if yrref >= 1900: self.refdateDT = dt.datetime(yrref,monref,dayref,horref,   \
     695          minref,secref)
     696        else: self.refdateDT = None
     697
     698        self.Tunits = origtunits
     699
     700
    553701def days_month(year,month):
    554702    """ Function to give the number of days of a month of a given year
     
    1623116379#  'days since 1949-12-01 00:00:00')
    1623216380
    16233 def fromanydate_CFYmd(date):
    16234     """ Function to transform from any string format of date to Y-m-d used in
    16235         CF-conventions
    16236       date: date to transform
    16237     >>> fromanydate_CFYmd('0001-01-01')
    16238     '0001-01-01'
    16239     >>> fromanydate_CFYmd('1850-1-1')
    16240     '1850-01-01'
    16241     >>> fromanydate_CFYmd('1850/1/1')
    16242     '1850-01-01'
    16243     >>> fromanydate_CFYmd('1976-02-17_08:32:27')
    16244     '1976-02-17'
    16245     """
    16246     fname = 'fromanydate_CFYmd'
    16247 
    16248     if date.count('-') + date.count('/') == 0 + date.count('.') == 0:
    16249         print errormsg
    16250         print '  ' + fname + ": date without either '-' or '/' or '.' not ready !!"
    16251         print "    passed date '" + date + "' not manegeable"
    16252         quit(-1)
    16253 
    16254     # Replacing '/', '.' by '-'
    16255     if date.count('/') != 0: date = date.replace('/','-')
    16256     if date.count('.') != 0: date = date.replace('.','-')
    16257 
    16258     # Removing possible [datre]_[time]
    16259     if date.count('_') != 0: date = date.split('_')[0]
    16260 
    16261     ldate = date.split('-')
    16262     if len(ldate) != 3:
    16263         print errormsg
    16264         print '  ' + fname + ": date '" + date + "' not ready !!"
    16265         print "     it requires 3 '-' sections '[yr]-[mo]-[dd]'"
    16266         quit(-1)
    16267 
    16268     yr = str(int(ldate[0])).zfill(4)
    16269     mo = str(int(ldate[1])).zfill(2)
    16270     dd = str(int(ldate[2])).zfill(2)
    16271 
    16272     newdate = yr + '-' + mo + '-' + dd
    16273 
    16274     return newdate
    1627516381
    1627616382def change_CFRefdate(timevals, origcftimeu, newSrefdate='1949-12-01 00:00:00'):
     
    1629116397
    1629216398    # original
    16293     origtv = origcftimeu.split(' ')
    16294     origtunits = origtv[0]
    16295     origSrefdate0 = origtv[2]
    16296 
    16297     origSrefdate = fromanydate_CFYmd(origSrefdate)
    16298 
    16299     yrref = int(origSrefdate[0:4])
    16300     monref = int(origSrefdate[5:7])
    16301     dayref = int(origSrefdate[8:10])
     16399    inftunits = CFtimeU_inf(origcftimeu)
     16400    origtunits = inftunits.Tunits
     16401    origSrefdate = inftunits.refdate
     16402
     16403    [yrref, monref, dayref, horref, minref, secref]= inftunits.refdatemat
    1630216404
    1630316405    if int(yrref) < 1970: origsing = -1.
    1630416406    else: origsing = 1.
    16305 
    16306 # Does original reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]
    16307 ##
    16308     trefT = origcftimeu.find(':')
    16309     if not trefT == -1:
    16310         if len(origtv) == 3:
    16311             horref=int(origSrefdate[11:13])
    16312             minref=int(origSrefdate[14:16])
    16313             secref=int(origSrefdate[17:19])
    16314         else:
    16315             origSreftime = origtv[3]
    16316             horref=int(origSreftime[0:2])
    16317             minref=int(origSreftime[3:5])
    16318             secref=int(origSreftime[6:8])
    16319     else:
    16320         horref = 0
    16321         minref = 0
    16322         secref = 0
    1632316407
    1632416408    # Transforming to julian days (reference -4712 January 1st 00 UTC)
     
    1640216486
    1640316487    # original
    16404     origtv = origcftimeu.split(' ')
    16405     origtunits = origtv[0]
    16406     if len(origtv) == 4:
    16407         origSrefdate = fromanydate_CFYmd(origtv[2]) + ' ' + origtv[3]
    16408     else:
    16409         print warnmsg
    16410         print '  ' + fname + ": original time units wihout time !!"
    16411         print "   adding it as '00:00:00'"
    16412         origSrefdate = fromanydate_CFYmd(origtv[2]) + ' 00:00:00'
     16488    inftunits = CFtimeU_inf(origcftimeu)
     16489    origtunits = inftunits.Tunits
     16490    origSrefdate = inftunits.refdate
    1641316491
    1641416492    # From original to days
     
    1645816536
    1645916537    return newtimevals, newcftimeu
    16460 
    16461 class CFtimeU_inf(object):
    16462     """ Classs to provide information of CFtime units
    16463       cftimeu: CF time units to provide information for [Timeu] since [RefDate]
    16464       * attributes:
    16465         refdate: reference date in Y-m-d H:M:S format
    16466         refdateYMHdms = reference date in YmdHMS format
    16467         refdatemat = reference date in matricial format
    16468         refdatejuliand = reference date as julian date (days since -4712 January 1st
    16469           00 UTC)
    16470         refdateDT = reference date as datetime object
    16471         Tunits = origtunits
    16472         utoweeks = Factor to convert values from original temporal units to weeks
    16473         utodays = Factor to convert values from original temporal units to days
    16474         utohours = Factor to convert values from original temporal units to hours
    16475         utominutes = Factor to convert values from original temporal units to minutes
    16476         utoseconds = Factor to convert values from original temporal units to seconds
    16477     """
    16478 
    16479     def __init__(self, cftimeu):
    16480         import datetime as dt
    16481         fname = 'CFtimeU_inf'
    16482 
    16483         availtu = ['weeks', 'days', 'hours', 'minutes', 'seconds']
    16484 
    16485         origtv = cftimeu.split(' ')
    16486         origtunits = origtv[0]
    16487         origSrefdate0 = origtv[2]
    16488 
    16489         origSrefdate = fromanydate_CFYmd(origSrefdate0)
    16490 
    16491         yrref = int(origSrefdate[0:4])
    16492         monref = int(origSrefdate[5:7])
    16493         dayref = int(origSrefdate[8:10])
    16494 
    16495 # Does original reference date contain a time value [YYYY]-[MM]-[DD] [HH]:[MI]:[SS]
    16496 ##
    16497         trefT = cftimeu.find(':')
    16498         if not trefT == -1:
    16499             if len(origtv) == 3:
    16500                 horref=int(origSrefdate[11:13])
    16501                 minref=int(origSrefdate[14:16])
    16502                 secref=int(origSrefdate[17:19])
    16503             else:
    16504                 origSreftime = origtv[3]
    16505                 horref=int(origSreftime[0:2])
    16506                 minref=int(origSreftime[3:5])
    16507                 secref=int(origSreftime[6:8])
    16508         else:
    16509             horref = 0
    16510             minref = 0
    16511             secref = 0
    16512 
    16513         horrefS = str(horref).zfill(2)
    16514         minrefS = str(minref).zfill(2)
    16515         secrefS = str(secref).zfill(2)
    16516 
    16517         # Transforming factors
    16518         if origtunits == 'weeks':
    16519             self.utoweeks = 1.
    16520             self.utodays = 7.
    16521             self.utohours = 7. * 24.
    16522             self.utominutes = 7. * 24. * 60.
    16523             self.utoseconds = 7. * 24. * 3600.
    16524         elif origtunits == 'days':
    16525             self.utoweeks = 1. / 7.
    16526             self.utodays = 1.
    16527             self.utohours = 24.
    16528             self.utominutes = 24. * 60.
    16529             self.utoseconds = 24. * 3600.
    16530         elif origtunits == 'hours':
    16531             self.utoweeks = 1. / ( 7. * 24.)
    16532             self.utodays = 1. / 24.
    16533             self.utohours = 1.
    16534             self.utominutes = 60.
    16535             self.utoseconds = 3600.
    16536         elif origtunits == 'minutes':
    16537             self.utoweeks = 1. / ( 7. * 24. * 60.)
    16538             self.utodays = 1. / ( 24. * 60.)
    16539             self.utohours = 1. / 60.
    16540             self.utominutes = 1.
    16541             self.utoseconds = 60.
    16542         elif origtunits == 'seconds':
    16543             self.utoweeks = 1. / ( 7. * 24. * 3600.)
    16544             self.utodays = 1. / ( 24. * 3600.)
    16545             self.utohours = 1. / 3600.
    16546             self.utominutes = 1. / 60.
    16547             self.utoseconds = 1.
    16548         else:
    16549             print errormsg
    16550             print '  ' + fname + ": new time-units '" + origtunits + "' not ready !!"
    16551             print '    available ones: ', availtu
    16552             quit(-1)
    16553 
    16554         self.refdate = origSrefdate + ' ' + horrefS + ':' + minrefS + ':' + secrefS
    16555         self.refdateYMHdms = origSrefdate[0:4] + origSrefdate[5:7] +                 \
    16556           origSrefdate[8:10] + horrefS + ':' + minrefS + ':' + secrefS
    16557         self.refdatemat = [yrref, monref, dayref, horref, minref, secref]
    16558         self.refdatejuliand = juliandate(yrref,monref,dayref,horref,minref,secref)
    16559         if yrref >= 1900: self.refdateDT = dt.datetime(yrref,monref,dayref,horref,   \
    16560           minref,secref)
    16561         else: self.refdateDT = None
    16562 
    16563         self.Tunits = origtunits
    1656416538
    1656516539def from360d_reg(tvals, tunits, kind='right'):
     
    1671216686
    1671316687    elif origcal == '3650d':
    16714         # We only can fix the 12x30 days calendar for monthly values...
     16688        print '  ' + fname + ": found non-standard calendar '" + origcal + "' !!"
     16689        # We only can fix the 12x30 days calendar for monthly values... ?
    1671516690        if type(timevals) == type(range(2)) or type(timevals) == type(np.arange(2)):
    1671616691            dt = timevals[1] - timevals[0]
     
    1671816693            dt = 30.
    1671916694        # Transforming to regular months
     16695        if newcal == 'gregorian' or newcal == 'standard':
     16696            newtimevals = from360d_reg(tvals, tunits, kind='monpercen')
    1672016697
    1672116698    else:
Note: See TracChangeset for help on using the changeset viewer.