|
20 | 20 | from typing import TextIO |
21 | 21 |
|
22 | 22 | import yaml |
| 23 | +from xarray import DataArray |
23 | 24 | from xarray import Dataset |
| 25 | +from xarray import decode_cf |
24 | 26 |
|
25 | 27 | from kaleidoscope import __name__ |
26 | 28 | from kaleidoscope import __version__ |
@@ -82,8 +84,9 @@ def _add_arguments(parser): |
82 | 84 | ) |
83 | 85 | parser.add_argument( |
84 | 86 | "target_file", |
85 | | - help="the file path of the target datasets. The pattern TTT is " |
86 | | - "replaced with the index value of the time slice extracted.", |
| 87 | + help="the file path of the target datasets. The pattern " |
| 88 | + "YYYYMMDD is replaced with the date associated with the " |
| 89 | + "time step extracted.", |
87 | 90 | type=Path, |
88 | 91 | ) |
89 | 92 |
|
@@ -130,15 +133,28 @@ def _add_version(parser): |
130 | 133 | ) |
131 | 134 |
|
132 | 135 |
|
133 | | -def index(i: int, w: int = 3) -> str: |
| 136 | +def date(t: DataArray) -> str: |
134 | 137 | """ |
135 | | - Converts an index number into an index string. |
| 138 | + Converts a time stamp into a date (YYYYMMDD). |
136 | 139 |
|
137 | | - :param i: The index number. |
138 | | - :param w: The width of the index string. |
139 | | - :return: The index string |
| 140 | + :param t: The time stamp. |
| 141 | + :return: The date. |
140 | 142 | """ |
141 | | - return str(i).rjust(w, "0") |
| 143 | + return t.dt.strftime("%Y%m%d").item() |
| 144 | + |
| 145 | + |
| 146 | +def time(d: Dataset) -> DataArray: |
| 147 | + """ |
| 148 | + Extracts the time data from a dataset. |
| 149 | +
|
| 150 | + :param d: The dataset. |
| 151 | + :return: The time data. |
| 152 | + """ |
| 153 | + t = decode_cf( |
| 154 | + d, |
| 155 | + drop_variables=[v for v in d.variables if v != VID_TIM], |
| 156 | + ) |
| 157 | + return t[VID_TIM] |
142 | 158 |
|
143 | 159 |
|
144 | 160 | class Processor(Processing): |
@@ -180,20 +196,20 @@ def run(self, args: Namespace): # noqa: D102 |
180 | 196 | source: Dataset | None = None |
181 | 197 | try: |
182 | 198 | reader: Reading = self._create_reader(args) |
183 | | - get_logger().debug(f"opening source dataset: {args.source_file}") |
184 | | - source = reader.read(args.source_file) |
185 | | - n = source[VID_TIM].size |
186 | | - for i in range(n): |
187 | | - writer: Writing = self._create_writer(args) |
| 199 | + source: Dataset = reader.read(args.source_file) |
| 200 | + t: DataArray = time(source) |
| 201 | + for i in range(t.size): |
188 | 202 | target: Dataset = source.isel(time=slice(i, i + 1)) |
189 | | - get_logger().info( |
190 | | - f"writing time step: {index(i)} ({index(n - 1)})" |
191 | | - ) |
192 | 203 | try: |
| 204 | + get_logger().info( |
| 205 | + f"starting writing time step: {date(t[i])}" |
| 206 | + ) |
| 207 | + writer: Writing = self._create_writer(args) |
193 | 208 | writer.write( |
194 | 209 | target, |
195 | | - f"{args.target_file}".replace("TTT", f"{index(i)}"), |
| 210 | + f"{args.target_file}".replace("YYYYMMDD", date(t[i])), |
196 | 211 | ) |
| 212 | + get_logger().info(f"finished writing time step") |
197 | 213 | finally: |
198 | 214 | if target is not None: |
199 | 215 | target.close() |
|
0 commit comments