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()))
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)
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)
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)
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)
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
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)
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)
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)