Changeset 2163 in lmdz_wrf for trunk/tools/generic_tools.py


Ignore:
Timestamp:
Oct 4, 2018, 7:16:27 PM (6 years ago)
Author:
lfita
Message:

Working on:

  • time_slices': Function to return temporal slices of a series of times for a given amount
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/generic_tools.py

    r2162 r2163  
    1412114121
    1412214122    mattimes = CFtimesvar_datetime(tv, tu, cal)
    14123     print 'mat times _______'
    14124     print mattimes
    1412514123
    1412614124    if type(tv) == type(np.arange(2)):
     
    1413314131        print '    available ones:', type(np.arange(1)), type(range(2))
    1413414132        quit(-1)
    14135 
    14136     slices = []
     14133    print 'mat times _______'   
     14134    for it in range(dimt):
     14135        print '  ',it, mattimes[it,:]
     14136
     14137    # Beginning and Ending of time data
     14138    it = 0
     14139    idate = dt.datetime(mattimes[it,0], mattimes[it,1], mattimes[it,2],             \
     14140      mattimes[it,3], mattimes[it,4], mattimes[it,5])
     14141    it = dimt-1
     14142    edate = dt.datetime(mattimes[it,0], mattimes[it,1], mattimes[it,2],             \
     14143      mattimes[it,3], mattimes[it,4], mattimes[it,5])
     14144
     14145    istats = mattimes[0,:]
     14146    estats = mattimes[dimt-1,:]
     14147    print 'idate:', idate, 'edate:', edate
     14148
     14149    # Getting the dates
    1413714150    if per == 'year':
    14138         imat = 0
    14139         # Getting unique values, since there is no cycle year periods
    14140         timatvals = list(mattimes[:,imat])
    14141         setvar = set(timatvals)
    14142         cyctimes = list(setvar)
    14143         cyctimes.sort()
    14144         Ncyctimes = len(cyctimes)
    14145         cyctimes.append(cyctimes[Ncyctimes-1]+1)
    14146         Ncyctimes = Ncyctimes + 1
    14147 
    14148         iit = 0
    14149         itt = 0
    14150         ip = cyctimes[itt]
    14151         ep = cyctimes[itt+amount]
    14152         for it in range(dimt):
    14153             # timeslice: [ini_slice, end_slice, freq_slice]
    14154             timeslice = [iit,iit,1]
    14155             ttv = mattimes[it,imat]
    14156             timeslice[1] = it
    14157             if not (ttv >= ip and ttv < ep):
    14158                 slices.append(timeslice)
    14159                 iit = it + 0
    14160                 itt = itt + amount
    14161                 ip = cyctimes[itt]
    14162                 ep = cyctimes[np.min([Ncyctimes-1,itt+amount])]
     14151        # Arranging accordingly beginning/ending statistics periods
     14152        istats[1] = 1
     14153        istats[2] = 1
     14154        istats[3:5] = 0
     14155        estats[0] = estats[0] + 1
     14156        estats[1] = 1
     14157        estats[2] = 1
     14158        estats[3:5] = 0
     14159
     14160        istdate = dt.datetime(istats[0], istats[1], istats[2], istats[3], istats[4], \
     14161          istats[5])
     14162        estdate = dt.datetime(estats[0], estats[1], estats[2], estats[3], estats[4], \
     14163          estats[5])
     14164
     14165        # Getting statistics periods
     14166        stmatdates = [istats]
     14167        idate = istdate
     14168        imdate = istats.copy()
     14169        while idate < estdate:
     14170            imdate = imdate.copy()
     14171            imdate[0] = imdate[0] + amount
     14172            idate= dt.datetime(imdate[0], imdate[1], imdate[2], imdate[3], imdate[4],\
     14173              imdate[5])
     14174            if idate < estdate: stmatdates.append(imdate)
     14175            else: break
     14176        stmatdates.append(imdate)
    1416314177
    1416414178    elif per == 'month':
    14165         imat = 1
    14166 
    14167         # cycle for months
    14168         Ncyctimes = 12
    14169         cyctimes = np.arange(Ncyctimes)+1
    14170        
    14171         print 'cyctimes:', cyctimes
    14172 
    14173         # First cycle time from first time
    14174         iit = 0
    14175         itt = index_vec(cyctimes,mattimes[0,imat])
    14176         ip = cyctimes[itt]
    14177         ep = cyclevar(cyctimes, itt+amount)
    14178         for it in range(dimt):
    14179             # timeslice: [ini_slice, end_slice, freq_slice]
    14180             timeslice = [iit,iit,1]
    14181             ttv = mattimes[it,imat]
    14182             timeslice[1] = it
    14183             if not (cyclevar_within(cyctimes, ip, ep, ttv)):
    14184                 slices.append(timeslice)
    14185                 iit = it + 0
    14186                 itt = itt + amount
    14187                 ip = cyclevar(cyctimes,itt)
    14188                 ep = cyclevar(cyctimes,itt+amount)
    14189 
    14190     elif per == 'day':
    14191         imat = 2
    14192 
    14193         for it in range(dimt):
    14194 
    14195             # cycle for days as function of the month
    14196             Ncyctimes = days_month(mattimes[it,0],mattimes[it,1])
    14197             cyctimes = np.arange(Ncyctimes)+1
    14198        
    14199             print 'cyctimes:', cyctimes
    14200 
    14201             # First cycle time from first time
    14202             iit = 0
    14203             itt = index_vec(cyctimes,mattimes[0,imat])
    14204             ip = cyctimes[itt]
    14205             ep = cyclevar(cyctimes, itt+amount)
    14206 
    14207             # timeslice: [ini_slice, end_slice, freq_slice]
    14208             timeslice = [iit,iit,1]
    14209             ttv = mattimes[it,imat]
    14210             timeslice[1] = it
    14211             if not (cyclevar_within(cyctimes, ip, ep, ttv)):
    14212                 slices.append(timeslice)
    14213                 iit = it + 0
    14214                 itt = itt + amount
    14215                 ip = cyclevar(cyctimes,itt)
    14216                 ep = cyclevar(cyctimes,itt+amount)
     14179        # Arranging accordingly beginning/ending statistics periods
     14180        istats[2] = 1
     14181        istats[3:5] = 0
     14182        estats[1] = estats[1]+1
     14183        if estats[1] > 12:
     14184            estats[0] = estats[0] + 1
     14185            estats[1] = 1
     14186        estats[2] = 1
     14187        estats[3:5] = 0
     14188
     14189        istdate = dt.datetime(istats[0], istats[1], istats[2], istats[3], istats[4], \
     14190          istats[5])
     14191        estdate = dt.datetime(estats[0], estats[1], estats[2], estats[3], estats[4], \
     14192          estats[5])
     14193
     14194        # Getting statistics periods
     14195        stmatdates = [istats]
     14196        idate = istdate
     14197        imdate = istats.copy()
     14198        while idate < estdate:
     14199            imdate = imdate.copy()
     14200            imdate[1] = imdate[1] + amount
     14201            if imdate[1] > 12:
     14202                imdate[0] = imdate[0] + 1
     14203                imdate[1] = 1
     14204            idate= dt.datetime(imdate[0], imdate[1], imdate[2], imdate[3], imdate[4],\
     14205              imdate[5])
     14206            if idate < estdate: stmatdates.append(imdate)
     14207            else: break
     14208        stmatdates.append(imdate)
     14209
    1421714210    else:
    1421814211        print errormsg
     
    1422114214        quit(-1)
    1422214215
     14216    # Getting the slices
     14217    ##
     14218    slices = []
     14219
     14220    # Passing to CF-times
     14221    Srefdate0 = tu.split(' ')[2]
     14222    Sreftime0 = tu.split(' ')[3]
     14223    tunits = tu.split(' ')[0]
     14224
     14225    if Srefdate0.find('/') != -1: Srdate = Srefdate0.replace('/', '')
     14226    elif Srefdate0.find('-') != -1: Srdate = Srefdate0.replace('-','')
     14227    else:
     14228        print errormsg
     14229        print '  ' + fname + ": I do not know how to create a [YYYY][MM][DD] " +     \
     14230          "date with '" + Srefdate0 + "' !!"
     14231        print "    expecting '/' or '-' splitting characters"
     14232        quit(-1)
     14233
     14234    if Sreftime0.find(':') != -1: Srtime = Sreftime0.replace(':', '')
     14235    else:
     14236        print errormsg
     14237        print '  ' + fname + ": I do not know how to create a [HH][MI][SS] " +       \
     14238          "date with '" + Sreftime0 + "' !!"
     14239        print "    expecting ':' splitting character"
     14240        quit(-1)
     14241
     14242    Srefdate = Srdate + Srtime
     14243    Nslices = len(stmatdates)
     14244    stmdates = np.zeros((Nslices,6), dtype=np.int)
     14245    print '  dates slices ________'
     14246    for islc in range(Nslices):
     14247        print islc, '  ', stmatdates[islc]
     14248        stmdates[islc,:] = stmatdates[islc]
     14249
     14250    cfstdates = realdatetime_CFcompilant(stmdates, Srefdate, tunits)
     14251
     14252    Nslices = len(cfstdates)
     14253    itt = 0
     14254    icfst = 0
     14255    for it in range(dimt):
     14256        timeslice = [itt,itt,1]
     14257        timeslice[1] = it
     14258        icfstup = np.min([icfst+1, Nslices-1])
     14259        print cfstdates[icfst], '<=', tv[it], '<', cfstdates[icfstup]
     14260        if not(tv[it] >= cfstdates[icfst] and tv[it] < cfstdates[icfstup]):
     14261            slices.append(timeslice)
     14262            itt = it
     14263            icfst = icfst + 1
     14264    slices.append(timeslice)
     14265
    1422314266    Nslices = len(slices)
    14224     for isl in range(Nslices):
    14225         print isl, cyctimes[isl], cyctimes[isl+amount+1], ':', slices[isl]
     14267    for isl in range(Nslices-1):
     14268        print isl, stmatdates[isl], stmatdates[isl+1], ':', slices[isl]
    1422614269
    1422714270    return slices, Nslices
     
    1422914272tv = []
    1423014273values = []
    14231 totT = 24.*60.
    14232 dT = 7.*60.
     14274totT = 31.
     14275dT = 7.
    1423314276for it in range(0,10):
    14234     for itt in range(3):
     14277   for itt in range(3):
    1423514278        tv.append(it*totT+dT*itt)
    1423614279        values.append(it*1.)
     
    1423814281vals = np.array(values)
    1423914282itdim = 0
    14240 tu = 'minutes since 1949-12-01 00:00:00'
    14241 per = 'day'
     14283tu = 'days since 1949-12-01 00:00:00'
     14284per = 'month'
    1424214285calend = 'standard'
    1424314286amount = 1
Note: See TracChangeset for help on using the changeset viewer.