IODA Bundle
hgodas_sst2ioda.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 #
4 # (C) Copyright 2019 UCAR
5 #
6 # This software is licensed under the terms of the Apache Licence Version 2.0
7 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
8 #
9 
10 from __future__ import print_function
11 import sys
12 import argparse
13 import netCDF4 as nc
14 from datetime import datetime, timedelta
15 from pathlib import Path
16 
17 IODA_CONV_PATH = Path(__file__).parent/"@SCRIPT_LIB_PATH@"
18 if not IODA_CONV_PATH.is_dir():
19  IODA_CONV_PATH = Path(__file__).parent/'..'/'lib-python'
20 sys.path.append(str(IODA_CONV_PATH.resolve()))
21 
22 import ioda_conv_ncio as iconv
23 from orddicts import DefaultOrderedDict
24 
25 
26 vName = {
27  'T': "sea_surface_temperature",
28 }
29 
30 locationKeyList = [
31  ("latitude", "float"),
32  ("longitude", "float"),
33  ("datetime", "string")
34 ]
35 
36 AttrData = {
37  'odb_version': 1,
38 }
39 
40 
41 class Profile(object):
42 
43  def __init__(self, filename, date, writer):
44  self.filenamefilename = filename
45  self.datedate = date
46  self.datadata = DefaultOrderedDict(lambda: DefaultOrderedDict(dict))
47  self.writerwriter = writer
48  self._read_read()
49 
50  def _read(self):
51  ncd = nc.Dataset(self.filenamefilename)
52  time = ncd.variables['time'][:]
53  lons = ncd.variables['lon'][:]
54  lats = ncd.variables['lat'][:]
55  hrs = ncd.variables['hr'][:]
56  vals = ncd.variables['val'][:]
57  errs = ncd.variables['err'][:]
58  qcs = ncd.variables['qc'][:]
59  ncd.close()
60 
61  base_date = datetime(1970, 1, 1) + timedelta(seconds=int(time[0]))
62 
63  valKey = vName['T'], self.writerwriter.OvalName()
64  errKey = vName['T'], self.writerwriter.OerrName()
65  qcKey = vName['T'], self.writerwriter.OqcName()
66 
67  count = 0
68  for i in range(len(hrs)):
69  # there shouldn't be any bad obs, but just in case remove them all
70  if qcs[i] != 0:
71  continue
72 
73  count += 1
74  dt = base_date + timedelta(hours=float(hrs[i]))
75  locKey = lats[i], lons[i], dt.strftime("%Y-%m-%dT%H:%M:%SZ")
76  self.datadata[0][locKey][valKey] = vals[i]
77  self.datadata[0][locKey][errKey] = errs[i]
78  self.datadata[0][locKey][qcKey] = qcs[i]
79 
80 
81 def main():
82 
83  parser = argparse.ArgumentParser(
84  description=('Read CPC Hybrid-GODAS sst files and convert'
85  ' to IODA format')
86  )
87  parser.add_argument('-i', '--input',
88  help="name of HGODAS profile input file",
89  type=str, required=True)
90  parser.add_argument('-o', '--output',
91  help="name of ioda output file",
92  type=str, required=True)
93  parser.add_argument('-d', '--date',
94  help="base date", type=str, required=True)
95  args = parser.parse_args()
96  fdate = datetime.strptime(args.date, '%Y%m%d%H')
97 
98  writer = iconv.NcWriter(args.output, locationKeyList)
99 
100  # Read in the profiles
101  prof = Profile(args.input, fdate, writer)
102 
103  # write them out
104  AttrData['date_time_string'] = fdate.strftime("%Y-%m-%dT%H:%M:%SZ")
105 
106  (ObsVars, LocMdata, VarMdata) = writer.ExtractObsData(prof.data)
107  writer.BuildNetcdf(ObsVars, LocMdata, VarMdata, AttrData)
108 
109 
110 if __name__ == '__main__':
111  main()
def __init__(self, filename, date, writer)