Skip to content

Commit 4bffbb0

Browse files
authored
Basetime offset needed for members between normal basetimes (#52)
* Basetime offset needed for members between normal basetimes * Linting * Linting * Adapt to basetime offset * Basetime must be set * Linting
1 parent 7bc6246 commit 4bffbb0

7 files changed

Lines changed: 43 additions & 11 deletions

File tree

pysurfex/file.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,7 +1186,7 @@ def read(self, var, times):
11861186
and self.geo.mask[j] == iii
11871187
):
11881188
field2d[i] = np.nan
1189-
if field[tstep, xxx, yyy, patch] != np.nan:
1189+
if not np.isnan(field[tstep, xxx, yyy, patch]):
11901190
field2d[i] = field[tstep, xxx, yyy, patch]
11911191
i = i + 1
11921192
j = j + 1
@@ -1195,7 +1195,7 @@ def read(self, var, times):
11951195
for yyy in range(field.shape[2]):
11961196
for xxx in range(field.shape[1]):
11971197
field2d[i] = np.nan
1198-
if field[tstep, xxx, yyy, patch] != np.nan:
1198+
if not np.isnan(field[tstep, xxx, yyy, patch]):
11991199
field2d[i] = field[tstep, xxx, yyy, patch]
12001200
i = i + 1
12011201
if i != npoints:

pysurfex/obs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -971,11 +971,11 @@ def __init__(self, fname, validtime, varname=None, label="vobs", sigmao=None):
971971
lat = odata["lat"]
972972
elev = odata["hgt"]
973973
obs = np.nan
974-
if obname in obsx[stid]:
975-
obs = obsx[stid][obname]
974+
if obname in odata:
975+
obs = odata[obname]
976976
if obs == -99:
977977
obs = np.nan
978-
value = obsx[stid][obname]
978+
value = odata[obname]
979979
if varname is None or varname == obname:
980980
observations.append(
981981
Observation(

pysurfex/util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def deep_update(source, overrides):
2424
returned = deep_update(source.get(key, {}), value)
2525
source[key] = returned
2626
else:
27-
override = overrides[key]
27+
override = value
2828
source[key] = override
2929
return source
3030

pysurfex/variable.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def __init__(self, var_type, var_dict, initial_basetime, prefer_forecast=True):
3131
Defaults to True.
3232
3333
Raises:
34+
RuntimeError: Initial base time not set
3435
RuntimeError: No filepattern provided
3536
RuntimeError: variable must have attribute
3637
RuntimeError: You can not have larger offset than the frequency of forecasts
@@ -45,6 +46,8 @@ def __init__(self, var_type, var_dict, initial_basetime, prefer_forecast=True):
4546

4647
self.filepattern = self.substitute_macros(var_dict["filepattern"])
4748
self.initial_basetime = initial_basetime
49+
if self.initial_basetime is None:
50+
raise RuntimeError("Initial base time not set")
4851
try:
4952
self.fcint = int(self.var_dict["fcint"])
5053
except KeyError:
@@ -70,6 +73,16 @@ def __init__(self, var_type, var_dict, initial_basetime, prefer_forecast=True):
7073
+ " > "
7174
+ str(self.fcint)
7275
)
76+
# Calculate basetime offset based on initial basetime and fcint
77+
seconds_since_midnight = int(
78+
(
79+
self.initial_basetime
80+
- self.initial_basetime.replace(hour=0, minute=0, second=0, microsecond=0)
81+
).total_seconds()
82+
)
83+
if seconds_since_midnight == 86400:
84+
seconds_since_midnight = 0
85+
self.basetime_offset = seconds_since_midnight % self.fcint
7386
accumulated, instant, file_var = self.set_var(validtime=self.initial_basetime)
7487
self.file_var = file_var
7588
self.instant = instant
@@ -559,11 +572,18 @@ def get_basetime(self, validtime, previoustime=None, allow_different_basetime=Fa
559572
logging.debug(" offset: %s", self.offset)
560573
logging.debug(" initial_basetime: %s", self.initial_basetime)
561574
logging.debug(" Basetime with offset: %s", basetime)
575+
logging.info(" Basetime offset: %s", self.basetime_offset)
562576

563577
# Modify based on fcint
564578
seconds_since_midnight = int(
565579
(
566-
basetime - basetime.replace(hour=0, minute=0, second=0, microsecond=0)
580+
basetime
581+
- basetime.replace(
582+
hour=int(self.basetime_offset / 3600),
583+
minute=0,
584+
second=0,
585+
microsecond=0,
586+
)
567587
).total_seconds()
568588
)
569589
if seconds_since_midnight == 86400:
@@ -586,7 +606,9 @@ def get_basetime(self, validtime, previoustime=None, allow_different_basetime=Fa
586606

587607
fcint = as_timedelta(seconds=self.fcint)
588608
basetime = (
589-
basetime.replace(hour=0, minute=0, second=0, microsecond=0)
609+
basetime.replace(
610+
hour=int(self.basetime_offset / 3600), minute=0, second=0, microsecond=0
611+
)
590612
+ (basetime_inc * fcint)
591613
- prefer_forecast
592614
)

tests/smoke/test_cli_arguments.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,16 @@ def parse_args(argv):
2525

2626

2727
def test_single_parameter(system_file_paths):
28-
argv = ["--inputfile", "fil_rh", "--inputtype", "surfex", "--variable", "rh2m"]
28+
argv = [
29+
"--basetime",
30+
"2019010100",
31+
"--inputfile",
32+
"fil_rh",
33+
"--inputtype",
34+
"surfex",
35+
"--variable",
36+
"rh2m",
37+
]
2938
parent_parser = argparse.ArgumentParser(add_help=False)
3039
variable_parse_options(parent_parser)
3140

tests/unit/test_interpolation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ def test_plot_wind_barbs(data_thredds_nc_file_aa):
297297
assert pytest.approx(new_field_y[i][j]) == target_new_field_y[i][j]
298298

299299
if plot:
300-
import matplotlib.pyplot as plt
300+
import matplotlib.pyplot as plt # noqa: PLC0415
301301

302302
plt.clf()
303303
plt.barbs(lon, lat, old_field_x, old_field_y, barbcolor=["red"])

tests/unit/test_variable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ def test_open_new_file_grib1(fixture):
279279

280280
def test_open_new_file_grib2(fixture):
281281
"""Test to open a grib2 file."""
282+
basetime = as_datetime_args(year=2019, month=11, day=13, hour=0)
282283
initialtime = as_datetime_args(year=2019, month=11, day=13, hour=2)
283284
intervall = 3600
284285
case = "grib2"
@@ -288,7 +289,7 @@ def test_open_new_file_grib2(fixture):
288289
for i in range(11):
289290
validtime = initialtime + as_timedelta(seconds=intervall * i)
290291
previoustime = validtime - as_timedelta(seconds=intervall)
291-
variable = Variable(var_type, var_dict, initialtime)
292+
variable = Variable(var_type, var_dict, basetime)
292293
previous_filename = variable.get_filename(validtime, previoustime=previoustime)
293294
filename = variable.get_filename(validtime)
294295
assert filename == var_dict["blueprint"][str(i)]

0 commit comments

Comments
 (0)