예제 #1
0
 def __init__(self,
              data=None,
              start=None,
              end=None,
              periods=None,
              freq='D',
              index=None):
     if index is None:
         if not data is None:
             if isinstance(data, MIArray):
                 data = data.aslist()
             self.data = data
             if isinstance(data[0], datetime.datetime):
                 self._index = MIDateTimeIndex(miutil.jdate(data))
             else:
                 self._index = MIDateTimeIndex(data)
         else:
             if start is None:
                 self._index = MIDateTimeIndex(periods, end, freq)
             elif end is None:
                 self._index = MIDateTimeIndex(start, periods, freq)
             else:
                 self._index = MIDateTimeIndex(start, end, freq)
             self.data = miutil.pydate(list(self._index.getDateValues()))
     else:
         self._index = index
         self.data = miutil.pydate(list(self._index.getDateValues()))
예제 #2
0
 def savegrid(self, x, y, fname, format='surfer', **kwargs):
     gdata = GridArray(self.array, x.array, y.array, -9999.0)
     if format == 'surfer':
         gdata.saveAsSurferASCIIFile(fname)
     elif format == 'bil':
         gdata.saveAsBILFile(fname)
     elif format == 'esri_ascii':
         gdata.saveAsESRIASCIIFile(fname)
     elif format == 'micaps4':
         desc = kwargs.pop('description', 'var')
         date = kwargs.pop('date', datetime.datetime.now())
         date = miutil.jdate(date)
         hours = kwargs.pop('hours', 0)
         level = kwargs.pop('level', 0)
         smooth = kwargs.pop('smooth', 1)
         boldvalue = kwargs.pop('boldvalue', 0)
         proj = kwargs.pop('proj', None)
         if proj is None:
             gdata.saveAsMICAPS4File(fname, desc, date, hours, level,
                                     smooth, boldvalue)
         else:
             if proj.isLonLat():
                 gdata.saveAsMICAPS4File(fname, desc, date, hours, level,
                                         smooth, boldvalue)
             else:
                 gdata.saveAsMICAPS4File(fname, desc, date, hours, level,
                                         smooth, boldvalue, proj)
예제 #3
0
 def writeindexrec(self, t, datahead, ksums=None):
     '''
     Write index record.
     
     :param t: (*datatime*) The time of the data.
     :param datahead: (*DataHeader') Data header of the record.
     :param ksums: (*list*) Check sum list.
     '''
     t = miutil.jdate(t)
     self.arldata.writeIndexRecord(t, datahead, ksums)
예제 #4
0
 def tostation(self, varname, x, y, z, t):
     '''
     Interpolate data to a point.
     '''
     if isinstance(t, datetime.datetime):
         t = miutil.jdate(t)
     if z is None:
         return self.dataset.toStation(varname, x, y, t)
     else:
         return self.dataset.toStation(varname, x, y, z, t)
예제 #5
0
def addtimedim(infn, outfn, t, tunit='hours'):
    '''
    Add a time dimension to a netCDF data file.
    
    :param infn: (*string*) Input netCDF file name.
    :param outfn: (*string*) Output netCDF file name.
    :param t: (*datetime*) A time value.
    :param tunit: (*string*) Time unite, Default is ``hours``.
    
    :returns: The new netCDF with time dimension.
    '''
    NetCDFDataInfo.addTimeDimension(infn, outfn, miutil.jdate(t), tunit)
예제 #6
0
def addtimedim(infn, outfn, t, tunit='hours'):
    '''
    Add a time dimension to a netCDF data file.
    
    :param infn: (*string*) Input netCDF file name.
    :param outfn: (*string*) Output netCDF file name.
    :param t: (*datetime*) A time value.
    :param tunit: (*string*) Time unite, Default is ``hours``.
    
    :returns: The new netCDF with time dimension.
    '''
    NetCDFDataInfo.addTimeDimension(infn, outfn, miutil.jdate(t), tunit)
예제 #7
0
 def writedatarec(self, t, lidx, vname, fhour, grid, data):
     '''
     Write data record.
     
     :param t: (*datetime*) The time of the data.
     :param lidx: (*int*) Level index.
     :param vname: (*string*) Variable name.
     :param fhour: (*int*) Forecasting hour.
     :param grid: (*int*) Grid id to check if the data grid is bigger than 999. Header 
         record does not support grids of more than 999, therefore in those situations 
         the grid number is converted to character to represent the 1000s digit, 
         e.g. @(64)=<1000, A(65)=1000, B(66)=2000, etc.
     :param data: (*array_like*) Data array.
     
     :returns: (*int*) Check sum of the record data.
     '''
     t = miutil.jdate(t)
     ksum = self.arldata.writeGridData(t, lidx, vname, fhour, grid, data.asarray())
     return ksum
예제 #8
0
 def savegrid(self, fname, format='surfer', **kwargs):
     '''
     Save the array data to an ASCII or binary file. The array must be 2 dimension.
     
     :param fname: (*string*) File name.
     :param format: (*string*) File format [surfer | bil | esri_ascii | micaps4].
     :param description: (*string*) Data description - only used for ``micaps4`` file.
     :param date: (*datetime*) Data datetime - only used for ``micaps4`` file.
     :param hours: (*int*) Data forcasting hours - only used for ``micaps4`` file.
     :param level: (*float*) Data vertical level - only used for ``micaps4`` file.
     :param smooth: (*int*) 1 or 0 - only used for ``micaps4`` file.
     :param boldvalue: (*int*) Bold contour value - only used for ``micaps4`` file.
     :param proj: (*ProjectionInfo*) Data ProjectionInfo - only used for ``micaps4`` file.
     :param float_format: (*string*) Float number format, such as '%.2f'.
     '''
     if self.ndim != 2:
         print 'The array must be 2 dimensional!'
         return
         
     gdata = self.asgridarray()
     if format == 'surfer':
         gdata.saveAsSurferASCIIFile(fname)
     elif format == 'bil':
         gdata.saveAsBILFile(fname)
     elif format == 'esri_ascii':
         gdata.saveAsESRIASCIIFile(fname)
     elif format == 'micaps4':
         desc = kwargs.pop('description', 'var')
         date = kwargs.pop('date', datetime.datetime.now())
         date = miutil.jdate(date)
         hours = kwargs.pop('hours', 0)
         level = kwargs.pop('level', 0)
         smooth = kwargs.pop('smooth', 1)
         boldvalue =kwargs.pop('boldvalue', 0)
         float_format = kwargs.pop('float_format', None)
         proj = kwargs.pop('proj', self.proj)
         if proj is None:
             gdata.saveAsMICAPS4File(fname, desc, date, hours, level, smooth, boldvalue, float_format)
         else:
             if proj.isLonLat():
                 gdata.saveAsMICAPS4File(fname, desc, date, hours, level, smooth, boldvalue, float_format)
             else:
                 gdata.saveAsMICAPS4File(fname, desc, date, hours, level, smooth, boldvalue, float_format, proj)
예제 #9
0
 def __init__(self, data=None, start=None, end=None, periods=None, freq='D', index=None):
     if index is None:
         if not data is None:
             if isinstance(data, MIArray):
                 data = data.aslist()
             self.data = data
             if isinstance(data[0], datetime.datetime):
                 self._index = MIDateTimeIndex(miutil.jdate(data))
             else:
                 self._index = MIDateTimeIndex(data)
         else:
             if start is None:
                 self._index = MIDateTimeIndex(periods, end, freq)
             elif end is None:
                 self._index = MIDateTimeIndex(start, periods, freq)
             else:
                 self._index = MIDateTimeIndex(start, end, freq)
             self.data = miutil.pydate(list(self._index.getDateValues()))
     else:
         self._index = index
         self.data = miutil.pydate(list(self._index.getDateValues()))
예제 #10
0
    def __getitem__(self, key):
        if isinstance(key, basestring):
            coldata = self.data.getColumnData(key)
            if coldata.getDataType().isNumeric():
                return MIArray(ArrayUtil.array(coldata.getDataValues()))
            elif coldata.getDataType() == DataTypes.Date:
                vv = coldata.getData()
                r = []
                cal = Calendar.getInstance()
                for v in vv:
                    cal.setTime(v)
                    year = cal.get(Calendar.YEAR)
                    month = cal.get(Calendar.MONTH) + 1
                    day = cal.get(Calendar.DAY_OF_MONTH)
                    hour = cal.get(Calendar.HOUR_OF_DAY)
                    minute = cal.get(Calendar.MINUTE)
                    second = cal.get(Calendar.SECOND)
                    dt = datetime.datetime(year, month, day, hour, minute,
                                           second)
                    r.append(dt)
                return r
            else:
                return MIArray(ArrayUtil.array(coldata.getData()))

        hascolkey = True
        if isinstance(key, tuple):
            ridx = key[0]
            cidx = key[1]
            if isinstance(ridx, int) and isinstance(cidx, int):
                if ridx < 0:
                    ridx = self.shape[0] + ridx
                if cidx < 0:
                    cidx = self.shape[1] + cidx
                return self.data.getValue(ridx, cidx)
            elif isinstance(ridx, int) and isinstance(cidx, basestring):
                if ridx < 0:
                    ridx = self.shape[0] + ridx
                return self.data.getValue(ridx, cidx)
        else:
            key = (key, slice(None))
            hascolkey = False

        k = key[0]
        if isinstance(k, int):
            sidx = k
            if sidx < 0:
                sidx = self.shape[0] + sidx
            eidx = sidx + 1
            step = 1
            rowkey = Range(sidx, eidx, step)
        elif isinstance(k, slice):
            if isinstance(k.start, basestring):
                t = miutil.str2date(k.start)
                t = miutil.jdate(t)
                sidx = self.data.getTimeIndex(t)
                if sidx < 0:
                    sidx = 0
            else:
                sidx = 0 if k.start is None else k.start
                if sidx < 0:
                    sidx = self.shape[0] + sidx
            if isinstance(k.stop, basestring):
                t = miutil.str2date(k.stop)
                t = miutil.jdate(t)
                eidx = self.data.getTimeIndex(t) + 1
                if eidx < 0:
                    eidx = self.shape[0]
            else:
                eidx = self.shape[0] if k.stop is None else k.stop
                if eidx < 0:
                    eidx = self.shape[0] + eidx
            step = 1 if k.step is None else k.step
            rowkey = Range(sidx, eidx, step)
        elif isinstance(k, list):
            if isinstance(k[0], basestring):
                tlist = []
                for tstr in k:
                    t = miutil.jdate(miutil.str2date(tstr))
                    idx = self.data.getTimeIndex_Ex(t)
                    if idx >= 0:
                        tlist.append(idx)
                rowkey = tlist
            else:
                rowkey = k
        else:
            return None

        tcolname = self.data.getTimeColName()
        if not hascolkey:
            r = self.data.select(rowkey)
            if r.findColumn(tcolname) is None:
                r = TableData(r)
            else:
                r = TimeTableData(r, tcolname)
            return PyTableData(r)

        k = key[1]
        if isinstance(k, int):
            sidx = k
            if sidx < 0:
                sidx = self.shape[1] + sidx
            eidx = sidx + 1
            step = 1
            colkey = Range(sidx, eidx, step)
        elif isinstance(k, slice):
            sidx = 0 if k.start is None else k.start
            if sidx < 0:
                sidx = self.shape[1] + sidx
            eidx = self.shape[1] if k.stop is None else k.stop
            if eidx < 0:
                eidx = self.shape[1] + eidx
            step = 1 if k.step is None else k.step
            colkey = Range(sidx, eidx, step)
        elif isinstance(k, list):
            if isinstance(k[0], basestring):
                cols = self.data.findColumns(k)
            else:
                cols = self.data.findColumns_Index(k)
            colkey = cols
        elif isinstance(k, basestring):
            rows = self.data.getRows(rowkey)
            coldata = self.data.getColumnData(rows, k)
            if coldata.getDataType().isNumeric():
                return MIArray(ArrayUtil.array(coldata.getDataValues()))
            else:
                return MIArray(ArrayUtil.array(coldata.getData()))
        else:
            return None

        r = self.data.select(rowkey, colkey)
        if r.findColumn(tcolname) is None:
            r = TableData(r)
        else:
            r = TimeTableData(r, tcolname)
        return PyTableData(r)
예제 #11
0
 def __getitem__(self, key):
     if isinstance(key, basestring):     
         coldata = self.data.getColumnData(key)
         if coldata.getDataType().isNumeric():
             return NDArray(ArrayUtil.array(coldata.getDataValues()))
         elif coldata.getDataType() == DataType.DATE:
             vv = coldata.getData()
             r = []
             for v in vv:
                 dt = miutil.pydate(v)
                 r.append(dt)
             return r
         else:
             return NDArray(ArrayUtil.array(coldata.getData()))
                     
     hascolkey = True
     if isinstance(key, tuple): 
         ridx = key[0]
         cidx = key[1]
         if isinstance(ridx, int) and isinstance(cidx, int):
             if ridx < 0:
                 ridx = self.shape[0] + ridx
             if cidx < 0:
                 cidx = self.shape[1] + cidx
             return self.data.getValue(ridx, cidx)
         elif isinstance(ridx, int) and isinstance(cidx, basestring):
             if ridx < 0:
                 ridx = self.shape[0] + ridx
             return self.data.getValue(ridx, cidx)
     else:
         key = (key, slice(None))
         hascolkey = False
         
     k = key[0]
     if isinstance(k, int):
         sidx = k
         if sidx < 0:
             sidx = self.shape[0] + sidx
         eidx = sidx + 1
         step = 1
         rowkey = Range(sidx, eidx, step)
     elif isinstance(k, slice):
         if isinstance(k.start, basestring):
             t = miutil.str2date(k.start)
             t = miutil.jdate(t)
             sidx = self.data.getTimeIndex(t)
             if sidx < 0:
                 sidx = 0
         else:
             sidx = 0 if k.start is None else k.start
             if sidx < 0:
                 sidx = self.shape[0] + sidx
         if isinstance(k.stop, basestring):
             t = miutil.str2date(k.stop)
             t = miutil.jdate(t)
             eidx = self.data.getTimeIndex(t) + 1
             if eidx < 0:
                 eidx = self.shape[0]
         else:
             eidx = self.shape[0] if k.stop is None else k.stop
             if eidx < 0:
                 eidx = self.shape[0] + eidx                    
         step = 1 if k.step is None else k.step
         rowkey = Range(sidx, eidx, step)
     elif isinstance(k, list):
         if isinstance(k[0], basestring):
             tlist = []
             for tstr in k:
                 t = miutil.jdate(miutil.str2date(tstr))
                 idx = self.data.getTimeIndex_Ex(t)
                 if idx >= 0:
                     tlist.append(idx)
             rowkey = tlist
         else:
             rowkey = k
     else:
         return None
                
     tcolname = self.data.getTimeColName()
     if not hascolkey:
         r = self.data.select(rowkey)
         if r.findColumn(tcolname) is None:
             r = TableData(r)
         else:
             r = TimeTableData(r, tcolname)
         return PyTableData(r)
         
     k = key[1]
     if isinstance(k, int):
         sidx = k
         if sidx < 0:
             sidx = self.shape[1] + sidx
         eidx = sidx + 1
         step = 1
         colkey = Range(sidx, eidx, step)
     elif isinstance(k, slice):
         sidx = 0 if k.start is None else k.start
         if sidx < 0:
             sidx = self.shape[1] + sidx
         eidx = self.shape[1] if k.stop is None else k.stop
         if eidx < 0:
             eidx = self.shape[1] + eidx                    
         step = 1 if k.step is None else k.step
         colkey = Range(sidx, eidx, step)        
     elif isinstance(k, list):
         if isinstance(k[0], basestring):
             cols = self.data.findColumns(k)
         else:
             cols = self.data.findColumns_Index(k)
         colkey = cols
     elif isinstance(k, basestring):
         rows = self.data.getRows(rowkey)
         coldata = self.data.getColumnData(rows, k)
         if coldata.getDataType().isNumeric():
             return NDArray(ArrayUtil.array(coldata.getDataValues()))
         else:
             return NDArray(ArrayUtil.array(coldata.getData()))
     else:
         return None
     
     r = self.data.select(rowkey, colkey)
     if r.findColumn(tcolname) is None:
         r = TableData(r)
     else:
         r = TimeTableData(r, tcolname)
     return PyTableData(r)
예제 #12
0
 def __getitem__(self, key):
     if isinstance(key, basestring):     
         coldata = self.data.getColumnData(key)
         if coldata.getDataType().isNumeric():
             return MIArray(ArrayUtil.array(coldata.getDataValues()))
         elif coldata.getDataType() == DataTypes.Date:
             vv = coldata.getData()
             r = []
             cal = Calendar.getInstance()
             for v in vv:
                 cal.setTime(v)
                 year = cal.get(Calendar.YEAR)
                 month = cal.get(Calendar.MONTH) + 1
                 day = cal.get(Calendar.DAY_OF_MONTH)
                 hour = cal.get(Calendar.HOUR_OF_DAY)
                 minute = cal.get(Calendar.MINUTE)
                 second = cal.get(Calendar.SECOND)
                 dt = datetime.datetime(year, month, day, hour, minute, second)
                 r.append(dt)
             return r
         else:
             return MIArray(ArrayUtil.array(coldata.getData()))
                     
     hascolkey = True
     if isinstance(key, tuple): 
         ridx = key[0]
         cidx = key[1]
         if isinstance(ridx, int) and isinstance(cidx, int):
             if ridx < 0:
                 ridx = self.shape[0] + ridx
             if cidx < 0:
                 cidx = self.shape[1] + cidx
             return self.data.getValue(ridx, cidx)
         elif isinstance(ridx, int) and isinstance(cidx, basestring):
             if ridx < 0:
                 ridx = self.shape[0] + ridx
             return self.data.getValue(ridx, cidx)
     else:
         key = (key, slice(None))
         hascolkey = False
         
     k = key[0]
     if isinstance(k, int):
         sidx = k
         if sidx < 0:
             sidx = self.shape[0] + sidx
         eidx = sidx + 1
         step = 1
         rowkey = Range(sidx, eidx, step)
     elif isinstance(k, slice):
         if isinstance(k.start, basestring):
             t = miutil.str2date(k.start)
             t = miutil.jdate(t)
             sidx = self.data.getTimeIndex(t)
             if sidx < 0:
                 sidx = 0
         else:
             sidx = 0 if k.start is None else k.start
             if sidx < 0:
                 sidx = self.shape[0] + sidx
         if isinstance(k.stop, basestring):
             t = miutil.str2date(k.stop)
             t = miutil.jdate(t)
             eidx = self.data.getTimeIndex(t) + 1
             if eidx < 0:
                 eidx = self.shape[0]
         else:
             eidx = self.shape[0] if k.stop is None else k.stop
             if eidx < 0:
                 eidx = self.shape[0] + eidx                    
         step = 1 if k.step is None else k.step
         rowkey = Range(sidx, eidx, step)
     elif isinstance(k, list):
         if isinstance(k[0], basestring):
             tlist = []
             for tstr in k:
                 t = miutil.jdate(miutil.str2date(tstr))
                 idx = self.data.getTimeIndex_Ex(t)
                 if idx >= 0:
                     tlist.append(idx)
             rowkey = tlist
         else:
             rowkey = k
     else:
         return None
                
     tcolname = self.data.getTimeColName()
     if not hascolkey:
         r = self.data.select(rowkey)
         if r.findColumn(tcolname) is None:
             r = TableData(r)
         else:
             r = TimeTableData(r, tcolname)
         return PyTableData(r)
         
     k = key[1]
     if isinstance(k, int):
         sidx = k
         if sidx < 0:
             sidx = self.shape[1] + sidx
         eidx = sidx + 1
         step = 1
         colkey = Range(sidx, eidx, step)
     elif isinstance(k, slice):
         sidx = 0 if k.start is None else k.start
         if sidx < 0:
             sidx = self.shape[1] + sidx
         eidx = self.shape[1] if k.stop is None else k.stop
         if eidx < 0:
             eidx = self.shape[1] + eidx                    
         step = 1 if k.step is None else k.step
         colkey = Range(sidx, eidx, step)        
     elif isinstance(k, list):
         if isinstance(k[0], basestring):
             cols = self.data.findColumns(k)
         else:
             cols = self.data.findColumns_Index(k)
         colkey = cols
     elif isinstance(k, basestring):
         rows = self.data.getRows(rowkey)
         coldata = self.data.getColumnData(rows, k)
         if coldata.getDataType().isNumeric():
             return MIArray(ArrayUtil.array(coldata.getDataValues()))
         else:
             return MIArray(ArrayUtil.array(coldata.getData()))
     else:
         return None
     
     r = self.data.select(rowkey, colkey)
     if r.findColumn(tcolname) is None:
         r = TableData(r)
     else:
         r = TimeTableData(r, tcolname)
     return PyTableData(r)