10 from __future__
import print_function
14 from datetime
import datetime, timedelta
15 import dateutil.parser
17 from pathlib
import Path
19 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
20 if not IODA_CONV_PATH.is_dir():
21 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
22 sys.path.append(
str(IODA_CONV_PATH.resolve()))
24 from orddicts
import DefaultOrderedDict
25 import ioda_conv_ncio
as iconv
30 def __init__(self, filename, thin, date, writer):
41 ncd = nc.MFDataset(self.
filenamefilename)
42 datein = ncd.variables[
'dtg_yyyymmdd'][:]
43 timein = ncd.variables[
'dtg_hhmm'][:]
44 lons = ncd.variables[
'longitude'][:]
45 lats = ncd.variables[
'latitude'][:]
46 vals = ncd.variables[
'ice_concentration'][:]
47 qc = ncd.variables[
'quality'][:]
50 valKey = vName, self.
writerwriter.OvalName()
51 errKey = vName, self.
writerwriter.OerrName()
52 qcKey = vName, self.
writerwriter.OqcName()
55 if self.
thinthin > 0.0:
56 mask_thin = np.random.uniform(size=len(lons)) > self.
thinthin
57 datein = datein[mask_thin]
58 timein = timein[mask_thin]
59 lons = lons[mask_thin]
60 lats = lats[mask_thin]
61 vals = vals[mask_thin]
64 date2 =
int(date.strftime(
"%Y%m%d"))
65 for i
in range(len(lons)):
66 if datein[i] == date2:
67 obs_date = datetime.combine(
70 datein[i]),
"%Y%m%d"), datetime.strptime(
72 timein[i]).zfill(4),
"%H%M").
time())
73 locKey = lats[i], lons[i], obs_date.strftime(
"%Y-%m-%dT%H:%M:%SZ")
74 self.
datadata[0][locKey][valKey] = vals[i]
75 self.
datadata[0][locKey][errKey] = 0.1
76 self.
datadata[0][locKey][qcKey] = qc[i]
79 vName =
"sea_ice_area_fraction"
82 (
"latitude",
"float"),
83 (
"longitude",
"float"),
84 (
"datetime",
"string")
94 parser = argparse.ArgumentParser(
98 required = parser.add_argument_group(title=
'required arguments')
99 required.add_argument(
101 help=
"EMC ice fraction obs input file(s)",
102 type=str, nargs=
'+', required=
True)
103 required.add_argument(
105 help=
"name of ioda output file",
106 type=str, required=
True)
107 required.add_argument(
109 help=
"base date for the center of the window",
110 metavar=
"YYYYMMDDHH", type=str, required=
True)
112 optional = parser.add_argument_group(title=
'optional arguments')
113 optional.add_argument(
115 help=
"percentage of random thinning, from 0.0 to 1.0. Zero indicates"
116 " no thinning is performed. (default: %(default)s)",
117 type=float, default=0.0)
119 args = parser.parse_args()
120 fdate = datetime.strptime(args.date,
'%Y%m%d%H')
121 writer = iconv.NcWriter(args.output, locationKeyList)
124 ice =
Observation(args.input, args.thin, fdate, writer)
127 AttrData[
'date_time_string'] = fdate.strftime(
"%Y-%m-%dT%H:%M:%SZ")
129 (ObsVars, LocMdata, VarMdata) = writer.ExtractObsData(ice.data)
130 writer.BuildNetcdf(ObsVars, LocMdata, VarMdata, AttrData)
133 if __name__ ==
'__main__':
def __init__(self, filename, thin, date, writer)