6 from collections
import OrderedDict
10 from netCDF4
import Dataset
17 def WriteNcVar(Gfid, Ofid, OutDest, Vname, Vdtype, Vdims, Vvals):
22 if (OutDest ==
'G' or OutDest ==
'B'):
24 Ovar = Gfid.createVariable(Vname, Vdtype, Vdims)
25 Ovar[...] = Vvals[...]
27 if (OutDest ==
'O' or OutDest ==
'B'):
29 Ovar = Ofid.createVariable(Vname, Vdtype, Vdims)
30 Ovar[...] = Vvals[...]
37 if (sys.version_info[0] == 2):
38 String = CharVec.tostring().rstrip(
'\x00')
40 String =
str(CharVec.tostring(),
'utf-8').rstrip(
'\x00')
51 def __init__(self, NcFname, LocKeyList, TestKeyList=None):
83 self.
_defaultF4_defaultF4 = np.float32(netCDF4.default_fillvals[
'f4'])
84 self.
_defaultI4_defaultI4 = np.int32(netCDF4.default_fillvals[
'i4'])
101 self.
_fid_fid = Dataset(NcFname,
'w', format=
'NETCDF4')
106 self.
_fid_fid.close()
130 if (NumpyDtype == np.dtype(
'float64')):
132 elif (NumpyDtype == np.dtype(
'float32')):
134 elif (NumpyDtype == np.dtype(
'int64')):
136 elif (NumpyDtype == np.dtype(
'int32')):
138 elif (NumpyDtype == np.dtype(
'int16')):
140 elif (NumpyDtype == np.dtype(
'int8')):
142 elif (NumpyDtype == np.dtype(
'S1')):
144 elif (NumpyDtype == np.dtype(
'U1')):
146 elif (NumpyDtype == np.dtype(
'S32')):
149 print(
"ERROR: Unrecognized numpy data type: ", NumpyDtype)
159 if (NumpyDtype == np.dtype(
'float64')):
161 elif (NumpyDtype == np.dtype(
'float32')):
163 elif (NumpyDtype == np.dtype(
'int64')):
164 IodaDtype =
'integer'
165 elif (NumpyDtype == np.dtype(
'int32')):
166 IodaDtype =
'integer'
167 elif (NumpyDtype == np.dtype(
'int16')):
168 IodaDtype =
'integer'
169 elif (NumpyDtype == np.dtype(
'int8')):
170 IodaDtype =
'integer'
171 elif (NumpyDtype == np.dtype(
'S1')):
174 print(
"ERROR: Unrecognized numpy data type: ", NumpyDtype)
181 Convert from date strings in ioda reference format "YYYY-mm-ddTHH:MM:SSZ" to decimal hour offsets from reference datetime.
183 Input: datestr_vec is an array of numpy chararrays, representing the raw bytes of the date string
184 Output: numpy dtype:'f4' array of time offsets in decimal hours from the reference date.
186 offset = np.zeros((self.
_nlocs_nlocs), dtype=
'f4')
188 date_offset_cache = {}
189 for i
in range(len(datestr_vec)):
190 date_bytes = datestr_vec[i].tobytes()
191 date_offset = date_offset_cache.get(date_bytes[0:10])
192 if date_offset
is None:
195 date_offset = delta.total_seconds()/3600.
196 date_offset_cache[date_bytes[0:10]] = date_offset
197 t_offset = (
int(date_bytes[11:13])*3600. +
int(date_bytes[14:16])*60. +
int(date_bytes[17:19]))/3600.
198 offset[i] = date_offset + (t_offset - ref_offset)
206 if (Dtype ==
"integer"):
207 Vector = np.zeros((Nsize), dtype=
'i4')
208 elif (Dtype ==
"float"):
209 Vector = np.zeros((Nsize), dtype=
'f4')
210 elif (Dtype ==
"string"):
211 Vector = np.chararray((Nsize, self.
_nstring_nstring))
212 elif (Dtype ==
"datetime"):
213 Vector = np.chararray((Nsize, self.
_ndatetime_ndatetime))
215 print(
"ERROR: Unrecognized vector data type: ", Dtype)
225 if (Dtype ==
"integer"):
227 elif (Dtype ==
"float"):
229 elif (Dtype ==
"string"):
230 StringType =
"S{0:d}".format(self.
_nstring_nstring)
231 s = np.array(Values, StringType)
233 Vector = netCDF4.stringtochar(s)
234 except (UnicodeEncodeError, UnicodeDecodeError)
as e:
235 Vector = netCDF4.stringtochar(s, encoding=
'bytes')
236 elif (Dtype ==
"datetime"):
237 StringType =
"S{0:d}".format(self.
_ndatetime_ndatetime)
238 Vector = netCDF4.stringtochar(np.array(Values, StringType))
240 print(
"ERROR: Unrecognized vector data type: ", Dtype)
253 for Aname, Aval
in AttrData.items():
254 if (Aname ==
"date_time_string"):
257 self.
_ref_date_time_ref_date_time = dt.datetime.strptime(Aval,
"%Y-%m-%dT%H:%M:%SZ")
262 self.
_fid_fid.setncattr(
"date_time", np.int32(refDateTime))
264 self.
_fid_fid.setncattr(Aname, Aval)
279 for VarKey, Vvals
in ObsVars.items():
280 (Vname, Gname) = VarKey
281 NcVname =
"{0:s}@{1:s}".format(Vname, Gname)
284 self.
_fid_fid[NcVname][:] = Vvals
286 if Gname
in [
'ObsValue',
'ObsError',
'GsiHofX',
'GsiHofXBc',
287 'GsiHofXClr',
'GsiFinalObsError',
'GsiBc',
'GsiBcConst',
288 'GsiBcScanAng',
'GsiAdjustObsError',
'GsiFinalObsError',
'GsiObsBias']:
290 self.
_fid_fid[NcVname].setncattr_string(
"units", VarUnits[Vname])
301 ToffsetName =
"time@{0:s}".format(MdataGroup)
302 self.
_fid_fid.createVariable(ToffsetName,
"f4", (DimName))
304 for Vname, Vvals
in Mdata.items():
305 NcVname =
"{0:s}@{1:s}".format(Vname, MdataGroup)
308 if (NcVname ==
"datetime@MetaData"):
311 self.
_fid_fid.createVariable(NcVname, NcDtype, (DimName, self.
_nstr_dim_name_nstr_dim_name))
313 self.
_fid_fid.createVariable(NcVname, NcDtype, (DimName))
315 self.
_fid_fid[NcVname][:] = Vvals
318 self.
_fid_fid[NcVname].setncattr_string(
"units", VarUnits[Vname])
325 if (NcVname ==
"datetime@MetaData"):
327 self.
_fid_fid[ToffsetName][:] = ToffsetValues
348 for RecKey, RecDict
in ObsData.items():
350 for LocKey, LocDict
in RecDict.items():
352 for VarKey, VarVal
in LocDict.items():
354 VarNames.add(VarKey[0])
355 if (VarKey
not in ObsVarList):
356 ObsVarList.append(VarKey)
357 ObsVarExamples.append(VarVal)
358 VarList = sorted(list(VarNames))
359 self.
_nvars_nvars = len(VarList)
362 ObsVars = OrderedDict()
363 for o
in range(len(ObsVarList)):
364 VarType =
type(ObsVarExamples[o])
365 if (VarType
in [float, np.float32, np.float64]):
367 elif (VarType
in [int, np.int64, np.int32, np.int8]):
369 elif (VarType
in [str, np.str_]):
371 elif (VarType
in [np.ma.core.MaskedConstant]):
377 print(
'Warning: VarType', VarType,
' not in float, int, str for:', ObsVarList[o])
379 ObsVars[ObsVarList[o]] = np.full((self.
_nlocs_nlocs), defaultval, dtype=defaultval.dtype)
381 LocMdata = OrderedDict()
386 if LocVname ==
"datetime":
387 LocVtype =
"datetime"
391 VarMdata = OrderedDict()
397 for RecKey, RecDict
in ObsData.items():
401 for LocKey, LocDict
in RecDict.items():
410 if LocVname ==
"datetime":
411 LocVtype =
"datetime"
413 LocMdata[LocVname][LocNum-1] = self.
FillNcVectorFillNcVector(LocKey[i], LocVtype)
416 for VarKey, VarVal
in LocDict.items():
417 if (
type(VarVal)
in [np.ma.core.MaskedConstant]):
419 ObsVars[VarKey][LocNum-1] = VarVal
421 return (ObsVars, LocMdata, VarMdata)
423 def BuildNetcdf(self, ObsVars, LocMdata, VarMdata, AttrData, VarUnits={}, TestData=None):
471 if TestData
is not None:
def BuildNetcdf(self, ObsVars, LocMdata, VarMdata, AttrData, VarUnits={}, TestData=None)
def ConvertToTimeOffset(self, datestr_vec)
def __init__(self, NcFname, LocKeyList, TestKeyList=None)
def NumpyToNcDtype(self, NumpyDtype)
_nvars
This method will extract information from the ObsData dictionary and reformat it into a more amenable...
def FillNcVector(self, Values, Dtype)
def ExtractObsData(self, ObsData)
def CreateNcVector(self, Nsize, Dtype)
def NumpyToIodaDtype(self, NumpyDtype)
def WriteNcObsVars(self, ObsVars, VarMdata, VarUnits)
def WriteNcAttr(self, AttrData)
def WriteNcMetadata(self, MdataGroup, DimName, Mdata, VarUnits)
_ref_date_time
This method will dump out the netcdf global attribute data contained in the dictionary AttrData.
def CharVectorToString(CharVec)
def WriteNcVar(Gfid, Ofid, OutDest, Vname, Vdtype, Vdims, Vvals)
SUBROUTINES.