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
27 changes: 27 additions & 0 deletions src/earthkit/data/utils/patterns.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import re

from .dates import to_datetime
from .dates import to_timedelta

RE1 = re.compile(r"{([^}]*)}")
RE2 = re.compile(r"\(([^}]*)\)")
Expand Down Expand Up @@ -62,6 +63,31 @@ def substitute(self, value, name):
return to_datetime(value).strftime(self.format)


class DatetimeDelta:
def __init__(self, params):
params_list = params.split(";")
if len(params_list) != 2:
raise ValueError(
"Invalid parameters '{}' for class DatetimeDelta, expected (delta;format)".format(params)
)
self.delta = params_list[0].strip()
self.format = params_list[1].strip()

def substitute(self, value, name):
sign = -1 if self.delta[0] == "-" else 1
if re.fullmatch(r"[-\+]?\d+[hms]?", self.delta):
delta = re.search(r"\d+[hms]?", self.delta).group(0)
else:
raise ValueError(
"Invalid value '{}' for delta, expected time in hour (h), minute (m) or second (s)".format(
self.delta
)
)

valid_date = to_datetime(value) + sign * to_timedelta(delta)
return valid_date.strftime(self.format)


class Str:
def __init__(self, format="%s"):
self.format = format
Expand All @@ -78,6 +104,7 @@ def substitute(self, value, name):
"float": Float,
"date": Datetime,
"strftime": Datetime,
"strftimedelta": DatetimeDelta,
"enum": Enum,
}

Expand Down
10 changes: 10 additions & 0 deletions tests/utils/test_patterns.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@
{"my_date": datetime.datetime(2020, 5, 13), "name": ["t2", "msl"]},
["test_2020-05-13_t2.grib", "test_2020-05-13_msl.grib"],
),
(
"test_{date:strftimedelta(-6;%Y-%m-%d_%H)}.grib",
{"date": [datetime.datetime(2020, 5, 11), datetime.datetime(2020, 5, 11, 6)]},
["test_2020-05-10_18.grib", "test_2020-05-11_00.grib"],
),
(
"test_{date:strftimedelta(60m;%Y-%m-%d_%H)}.grib",
{"date": [datetime.datetime(2020, 5, 11), datetime.datetime(2020, 5, 11, 6)]},
["test_2020-05-11_01.grib", "test_2020-05-11_07.grib"],
),
],
)
def test_pattern_core(pattern, values, expected_value):
Expand Down
Loading