Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions covjsonkit/decoder/VerticalProfile.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import xarray as xr

from ..encoder.encoder import sort_step_values, valid_time
from ..encoder.encoder import anoffset_timedelta, sort_step_values, valid_time
from .decoder import Decoder


Expand Down Expand Up @@ -168,7 +168,9 @@ def to_xarray(self):
if len(param_values[parameter][domain_idx][i][j]) <= k:
param_values[parameter][domain_idx][i][j].append([])
for coverage in self.covjson["coverages"]:
new_step = valid_time(date, step)
new_step = valid_time(
date, step, anoffset=anoffset_timedelta(coverage["mars:metadata"])
)
if (
coverage["mars:metadata"]["number"] == num
and self.forecast_reference(coverage) == date
Expand Down
5 changes: 3 additions & 2 deletions covjsonkit/encoder/BoundingBox.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
range_shape,
Expand Down Expand Up @@ -126,7 +127,7 @@ def from_xarray(self, dataset):
dv_dict[dv] = dataset[dv].sel(number=num, steps=step, datetimes=datetime).values.tolist()

cov_coords = dict(coords)
cov_coords["t"] = [valid_time(datetime, step)]
cov_coords["t"] = [valid_time(datetime, step, anoffset=anoffset_timedelta(mars_metadata))]
self.add_coverage(mars_metadata, cov_coords, dv_dict, include_z)

# Return the generated CoverageJSON
Expand Down Expand Up @@ -213,7 +214,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
mm["step"] = normalize_step_value(step)
# ``t`` is the valid-time (forecast date + step offset).
cov_coords = dict(coords[date])
cov_coords["t"] = [valid_time(date, step)]
cov_coords["t"] = [valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))]
if reanalysis:
# Reanalysis (class=ce, stream=efcl): expose only the
# valid-time; drop the scalar forecast-date metadata.
Expand Down
5 changes: 3 additions & 2 deletions covjsonkit/encoder/Circle.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
range_shape,
Expand Down Expand Up @@ -117,7 +118,7 @@ def from_xarray(self, dataset):
dv_dict[dv] = dataset[dv].sel(number=num, steps=step, datetimes=datetime).values.tolist()

cov_coords = dict(coords)
cov_coords["t"] = [valid_time(datetime, step)]
cov_coords["t"] = [valid_time(datetime, step, anoffset=anoffset_timedelta(mars_metadata))]
self.add_coverage(mars_metadata, cov_coords, dv_dict, include_z)

return self.covjson
Expand Down Expand Up @@ -200,7 +201,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
mm["number"] = num
mm["step"] = normalize_step_value(step)
cov_coords = dict(coords[date])
cov_coords["t"] = [valid_time(date, step)]
cov_coords["t"] = [valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))]
if reanalysis:
mm.pop("Forecast date", None)
mm.pop("step", None)
Expand Down
5 changes: 3 additions & 2 deletions covjsonkit/encoder/Frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
range_shape,
Expand Down Expand Up @@ -117,7 +118,7 @@ def from_xarray(self, dataset):
dv_dict[dv] = dataset[dv].sel(number=num, steps=step, datetimes=datetime).values.tolist()

cov_coords = dict(coords)
cov_coords["t"] = [valid_time(datetime, step)]
cov_coords["t"] = [valid_time(datetime, step, anoffset=anoffset_timedelta(mars_metadata))]
self.add_coverage(mars_metadata, cov_coords, dv_dict, include_z)

return self.covjson
Expand Down Expand Up @@ -197,7 +198,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
mm["number"] = num
mm["step"] = normalize_step_value(step)
cov_coords = dict(coords[date])
cov_coords["t"] = [valid_time(date, step)]
cov_coords["t"] = [valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))]
if reanalysis:
mm.pop("Forecast date", None)
mm.pop("step", None)
Expand Down
18 changes: 15 additions & 3 deletions covjsonkit/encoder/Grid.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import logging
import time

from .encoder import Encoder, is_reanalysis, normalize_step_value, valid_time
from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
valid_time,
)


class Grid(Encoder):
Expand Down Expand Up @@ -123,7 +129,11 @@ def from_xarray(self, dataset):
arr = dataset[dv].sel(datetimes=datetime, number=num, steps=step).values
dv_dict[dv] = arr.ravel().tolist()

coords = {"t": [valid_time(datetime, step)], "y": y_vals, "x": x_vals}
coords = {
"t": [valid_time(datetime, step, anoffset=anoffset_timedelta(mars_metadata))],
"y": y_vals,
"x": x_vals,
}
if include_z:
coords["z"] = z_vals
self.add_coverage(mars_metadata, coords, dv_dict, include_z)
Expand Down Expand Up @@ -188,7 +198,9 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
for date in coords.keys():
coordinates[date] = {}
# ``t`` axis holds the valid-time (forecast date + step) for each step.
coordinates[date]["t"] = [valid_time(date, s) for s in fields["step"]]
coordinates[date]["t"] = [
valid_time(date, s, anoffset=anoffset_timedelta(mars_metadata)) for s in fields["step"]
]
if include_z:
coordinates[date]["z"] = list(fields["levels"])
coordinates[date]["y"] = []
Expand Down
3 changes: 2 additions & 1 deletion covjsonkit/encoder/Path.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
range_shape,
Expand Down Expand Up @@ -174,7 +175,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
# The composite ``t`` coordinate is the valid-time
# (forecast date + step offset), as an ISO-8601 string.
# The original ``s`` is kept for the range_dict lookups.
t_valid = valid_time(date, s)
t_valid = valid_time(date, s, anoffset=anoffset_timedelta(mars_metadata))
if include_z:
if len(fields["levels"]) != 1:
for lev in fields["levels"]:
Expand Down
6 changes: 4 additions & 2 deletions covjsonkit/encoder/Position.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging
import time

from .encoder import Encoder, is_reanalysis, range_shape, valid_time
from .encoder import Encoder, anoffset_timedelta, is_reanalysis, range_shape, valid_time


class Position(Encoder):
Expand Down Expand Up @@ -188,7 +188,9 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
for num in fields["number"]:
for para in fields["param"]:
for step in fields["step"]:
coordinates[date][i]["t"].append(valid_time(date, step))
coordinates[date][i]["t"].append(
valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))
)
break
break
break
Expand Down
5 changes: 3 additions & 2 deletions covjsonkit/encoder/Shapefile.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
range_shape,
Expand Down Expand Up @@ -117,7 +118,7 @@ def from_xarray(self, dataset):
dv_dict[dv] = dataset[dv].sel(number=num, steps=step, datetimes=datetime).values.tolist()

cov_coords = dict(coords)
cov_coords["t"] = [valid_time(datetime, step)]
cov_coords["t"] = [valid_time(datetime, step, anoffset=anoffset_timedelta(mars_metadata))]
self.add_coverage(mars_metadata, cov_coords, dv_dict, include_z)

return self.covjson
Expand Down Expand Up @@ -197,7 +198,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
mm["number"] = num
mm["step"] = normalize_step_value(step)
cov_coords = dict(coords[date])
cov_coords["t"] = [valid_time(date, step)]
cov_coords["t"] = [valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))]
if reanalysis:
mm.pop("Forecast date", None)
mm.pop("step", None)
Expand Down
13 changes: 11 additions & 2 deletions covjsonkit/encoder/TimeSeries.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
iso_utc,
range_shape,
reference_datetime,
Expand Down Expand Up @@ -273,7 +274,9 @@ def from_polytope(self, result, date_key: str = "date", reforecast: bool = False
for num in fields["number"]:
for para in fields["param"]:
for step in fields["step"]:
coordinates[date][i]["t"].append(valid_time(date, step))
coordinates[date][i]["t"].append(
valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))
)
break
break
break
Expand Down Expand Up @@ -369,6 +372,7 @@ def from_polytope_reforecast(self, result) -> dict:
coverages = {}
coverage_order = []
param_order = []
anoffsets = {}
# Set True as soon as a forecast (efas) coverage is created, so the final
# emission can be reordered date -> time -> point (see below).
forecast_result = False
Expand Down Expand Up @@ -412,7 +416,10 @@ def emit(full_path, flat_result):
step = d.get("step", 0)
hdate = d.get("hdate", d.get("date"))
time_off = d.get("time")
stamp = valid_datetime(hdate, step, time_off)
if "anoffset" in d:
anoffsets["anoffset"] = self._single_anoffset(anoffsets, d["anoffset"])
# ce/ef/gf: step is counted from the analysis reference, anoffset before the run.
stamp = valid_datetime(hdate, step, time_off, anoffset_timedelta(d))

# Stream determines the coverage grouping for class=ce:
# * efcl (reforecast/reanalysis): collapse all hdates into a
Expand Down Expand Up @@ -440,6 +447,8 @@ def emit(full_path, flat_result):
if name in exclude_meta:
continue
meta[name] = stringify(d[name])
if "anoffset" in meta:
meta["anoffset"] = anoffsets["anoffset"]
meta["number"] = number
meta["levelist"] = level
# efas: Forecast date is the run (date + time); efcl: none;
Expand Down
8 changes: 6 additions & 2 deletions covjsonkit/encoder/VerticalProfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
range_shape,
Expand Down Expand Up @@ -118,7 +119,10 @@ def from_xarray(self, datasets):
"latitude": [float(x) for x in dataset["latitude"].values],
"longitude": [float(x) for x in dataset["longitude"].values],
"levelist": [float(x) for x in dataset["levelist"].values],
"t": [valid_time(x, step) for x in dataset["datetime"].values],
"t": [
valid_time(x, step, anoffset=anoffset_timedelta(mars_metadata))
for x in dataset["datetime"].values
],
},
dv_dict,
)
Expand Down Expand Up @@ -173,7 +177,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
"latitude": [coords[date]["composite"][i][0]],
"longitude": [coords[date]["composite"][i][1]],
"levelist": list(levels),
"t": [valid_time(date, step)],
"t": [valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))],
}
)

Expand Down
5 changes: 3 additions & 2 deletions covjsonkit/encoder/Wkt.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from .encoder import (
Encoder,
anoffset_timedelta,
is_reanalysis,
normalize_step_value,
range_shape,
Expand Down Expand Up @@ -119,7 +120,7 @@ def from_xarray(self, dataset):
dv_dict[dv] = dataset[dv].sel(number=num, steps=step, datetimes=datetime).values.tolist()

cov_coords = dict(coords)
cov_coords["t"] = [valid_time(datetime, step)]
cov_coords["t"] = [valid_time(datetime, step, anoffset=anoffset_timedelta(mars_metadata))]
self.add_coverage(mars_metadata, cov_coords, dv_dict, include_z)

return self.covjson
Expand Down Expand Up @@ -202,7 +203,7 @@ def from_polytope(self, result, date_key: str = "date") -> dict:
mm["number"] = num
mm["step"] = normalize_step_value(step)
cov_coords = dict(coords[date])
cov_coords["t"] = [valid_time(date, step)]
cov_coords["t"] = [valid_time(date, step, anoffset=anoffset_timedelta(mars_metadata))]
if reanalysis:
mm.pop("Forecast date", None)
mm.pop("step", None)
Expand Down
Loading
Loading