Skip to content

Commit c648d39

Browse files
committed
Add time dependant VariableAxis to CSV
1 parent 85341f6 commit c648d39

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

speasy/core/codecs/bundled_codecs/hapi_csv/codec.py

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
from .writer import save_hapi_csv
1919

2020

21+
def _time_dependent_axis_name(ax: VariableAxis) -> str:
22+
return f"{ax.name}_centers_time_varying"
23+
24+
def _get_variable_axes(variable: SpeasyVariable, is_time_dependent: bool) -> List[VariableAxis]:
25+
return [ax for ax in variable.axes[1:] if ax.is_time_dependent == is_time_dependent]
26+
2127
def _create_meta(variable:SpeasyVariable) -> Dict[str, Any]:
2228
meta = {
2329
"name": variable.name,
@@ -44,12 +50,23 @@ def _create_meta(variable:SpeasyVariable) -> Dict[str, Any]:
4450
if len(variable.values.shape) > 1:
4551
meta["size"] = variable.values.shape[1:]
4652

47-
time_independent_axes = [ax for ax in variable.axes[1:] if not ax.is_time_dependent]
53+
bins = []
54+
time_independent_axes = _get_variable_axes(variable, is_time_dependent=False)
4855
if time_independent_axes:
49-
meta["bins"] = [
50-
{"name": ax.name, "units": ax.unit, "centers": ax.values.tolist()}
56+
bins.extend([
57+
{"name": ax.name, "unit": ax.unit, "centers": ax.values.tolist()}
5158
for ax in time_independent_axes
52-
]
59+
])
60+
61+
time_dependent_axes = _get_variable_axes(variable, is_time_dependent=True)
62+
if time_dependent_axes:
63+
bins.extend([
64+
{"name": ax.name, "unit": ax.unit, "centers": _time_dependent_axis_name(ax)}
65+
for ax in time_dependent_axes
66+
])
67+
68+
if bins:
69+
meta["bins"] = bins
5370

5471
return meta
5572

@@ -67,8 +84,9 @@ def _bin_to_axis(json_bin: Dict[str, Any], hap_csv_file: HapiCsvFile) -> Variabl
6784
raise ValueError("Invalid bin specification: missing 'centers' field")
6885
if isinstance(centers, str):
6986
hapi_parameter = hap_csv_file.get_parameter(centers)
87+
_meta = _decode_meta(hapi_parameter.meta)
7088
variable_axis = VariableAxis(values=hapi_parameter.values,
71-
meta=hapi_parameter.meta,
89+
meta=_meta,
7290
is_time_dependent=True,
7391
name=name)
7492
elif isinstance(centers, list):
@@ -77,7 +95,7 @@ def _bin_to_axis(json_bin: Dict[str, Any], hap_csv_file: HapiCsvFile) -> Variabl
7795
except ValueError:
7896
raise ValueError("Invalid bin specification: 'centers' list must contain numeric values")
7997
variable_axis = VariableAxis(values=axis_values,
80-
meta={"name": "centers"},
98+
meta={"name": "centers", "UNITS": json_bin.get("units", None)},
8199
is_time_dependent=False,
82100
name=name)
83101
else:
@@ -122,6 +140,18 @@ def _make_hapi_csv_time_axis(time_axis: VariableTimeAxis) -> HapiCsvParameter:
122140
return HapiCsvParameter(values=time_axis.values,
123141
meta={"name": "Time", "type": "isotime", "units": "UTC", "length": 30, "fill": None})
124142

143+
def _get_hapi_csv_varying_axes(variable: SpeasyVariable) -> List[HapiCsvParameter]:
144+
result = []
145+
for ax in _get_variable_axes(variable, is_time_dependent=True):
146+
meta = {
147+
"name": _time_dependent_axis_name(ax),
148+
"type": "double",
149+
"units": ax.unit,
150+
"size": [ax.values.shape[1]]
151+
}
152+
result.append(HapiCsvParameter(values=ax.values, meta=meta))
153+
return result
154+
125155

126156
def _speasy_variables_to_hapi_csv(variables: List[SpeasyVariable]) -> HapiCsvFile:
127157
if not same_time_axis(variables):
@@ -132,6 +162,8 @@ def _speasy_variables_to_hapi_csv(variables: List[SpeasyVariable]) -> HapiCsvFil
132162
hapi_csv_file.add_parameter(_make_hapi_csv_time_axis(variables[0].axes[0]))
133163
for var in variables:
134164
hapi_csv_file.add_parameter(_make_hapi_csv_parameter(var))
165+
for hapi_axis_parameter in _get_hapi_csv_varying_axes(var):
166+
hapi_csv_file.add_parameter(hapi_axis_parameter)
135167
return hapi_csv_file
136168

137169

tests/resources/HAPI_ndData_TimeVarying_Axis.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,4 @@
6666
#}
6767

6868
1970-01-01T00:00:00.000Z,0,1,0.5,0.3333333333333333,0.25,0.2,0.16666666666666666,0.14285714285714285,0.125,0.1111111111111111,11,13,15,17,19,21,23,25,27,29,10,12,12,14,14,16,16,18,18,20,20,22,22,24,24,26,26,28,28,30
69-
1970-01-01T00:00:01.000Z,0,1,0.5,0.3333333333333333,0.25,0.2,0.16666666666666666,0.14285714285714285,0.125,0.1111111111111111,11,13,15,17,19,21,23,25,27,29,10,12,12,14,14,16,16,18,18,20,20,22,22,24,24,26,26,28,28,30
69+
1970-01-01T00:01:08.000Z,0,1,0.5,0.3333333333333333,0.25,0.2,0.16666666666666666,0.14285714285714285,0.125,0.1111111111111111,1,3,5,7,9,11,13,15,17,19

tests/test_hapi_codecs.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def test_speasy_to_csv(self):
153153
self.assertListEqual(var_names, csv_names)
154154

155155

156-
def test_time_independant_axis_to_csv(self):
156+
def test_time_independent_axis_to_csv(self):
157157
hapi_csv_codec: CodecInterface = get_codec('hapi/csv')
158158
with open(os.path.join(__HERE__, 'resources', 'HAPI_ndData_TimeIndependent_Axis.csv'), 'r') as f:
159159
variables = hapi_csv_codec.load_variables(file=f, variables=['ace_epam_de_e'], disable_cache=True)
@@ -164,3 +164,13 @@ def test_time_independant_axis_to_csv(self):
164164
self.assertTrue(hapi_csv_file)
165165
self.assertTrue(os.path.exists(output_csv_file))
166166

167+
def test_time_varying_axis_to_csv(self):
168+
hapi_csv_codec: CodecInterface = get_codec('hapi/csv')
169+
with open(os.path.join(__HERE__, 'resources', 'HAPI_ndData_TimeVarying_Axis.csv'), 'r') as f:
170+
variables = hapi_csv_codec.load_variables(file=f, variables=['spectra_time_dependent_bins'], disable_cache=True)
171+
self.assertIn('spectra_time_dependent_bins', variables)
172+
with tempfile.NamedTemporaryFile(suffix='.csv', delete=True) as tmp:
173+
output_csv_file = tmp.name
174+
hapi_csv_file = hapi_csv_codec.save_variables(variables=list(variables.values()), file=output_csv_file)
175+
self.assertTrue(hapi_csv_file)
176+
self.assertTrue(os.path.exists(output_csv_file))

0 commit comments

Comments
 (0)