rashdf 0.8.3__tar.gz → 0.8.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rashdf-0.8.3 → rashdf-0.8.4}/PKG-INFO +1 -1
- {rashdf-0.8.3 → rashdf-0.8.4}/pyproject.toml +1 -1
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf/utils.py +75 -57
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf.egg-info/PKG-INFO +1 -1
- {rashdf-0.8.3 → rashdf-0.8.4}/tests/test_utils.py +45 -1
- {rashdf-0.8.3 → rashdf-0.8.4}/LICENSE +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/README.md +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/setup.cfg +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/cli.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf/__init__.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf/base.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf/geom.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf/plan.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf.egg-info/SOURCES.txt +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf.egg-info/dependency_links.txt +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf.egg-info/entry_points.txt +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf.egg-info/requires.txt +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/src/rashdf.egg-info/top_level.txt +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/tests/test_base.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/tests/test_cli.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/tests/test_geom.py +0 -0
- {rashdf-0.8.3 → rashdf-0.8.4}/tests/test_plan.py +0 -0
|
@@ -12,7 +12,7 @@ classifiers = [
|
|
|
12
12
|
"Programming Language :: Python :: 3.11",
|
|
13
13
|
"Programming Language :: Python :: 3.12",
|
|
14
14
|
]
|
|
15
|
-
version = "0.8.
|
|
15
|
+
version = "0.8.4"
|
|
16
16
|
dependencies = ["h5py", "geopandas>=1.0,<2.0", "pyarrow", "xarray<=2025.4.0"]
|
|
17
17
|
|
|
18
18
|
[project.optional-dependencies]
|
|
@@ -10,6 +10,36 @@ from typing import Any, Callable, List, Tuple, Union, Optional
|
|
|
10
10
|
import warnings
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
def deprecated(func) -> Callable:
|
|
14
|
+
"""
|
|
15
|
+
Deprecate a function.
|
|
16
|
+
|
|
17
|
+
This is a decorator which can be used to mark functions as deprecated.
|
|
18
|
+
It will result in a warning being emitted when the function is used.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
func: The function to be deprecated.
|
|
23
|
+
|
|
24
|
+
Returns
|
|
25
|
+
-------
|
|
26
|
+
The decorated function.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def new_func(*args, **kwargs):
|
|
30
|
+
warnings.warn(
|
|
31
|
+
f"{func.__name__} is deprecated and will be removed in a future version.",
|
|
32
|
+
category=DeprecationWarning,
|
|
33
|
+
stacklevel=2,
|
|
34
|
+
)
|
|
35
|
+
return func(*args, **kwargs)
|
|
36
|
+
|
|
37
|
+
new_func.__name__ = func.__name__
|
|
38
|
+
new_func.__doc__ = func.__doc__
|
|
39
|
+
new_func.__dict__.update(func.__dict__)
|
|
40
|
+
return new_func
|
|
41
|
+
|
|
42
|
+
|
|
13
43
|
def parse_ras_datetime_ms(datetime_str: str) -> datetime:
|
|
14
44
|
"""Parse a datetime string with milliseconds from a RAS file into a datetime object.
|
|
15
45
|
|
|
@@ -36,24 +66,37 @@ def parse_ras_datetime(datetime_str: str) -> datetime:
|
|
|
36
66
|
|
|
37
67
|
Parameters
|
|
38
68
|
----------
|
|
39
|
-
datetime_str (str): The datetime string to be parsed.
|
|
69
|
+
datetime_str (str): The datetime string to be parsed.
|
|
40
70
|
|
|
41
71
|
Returns
|
|
42
72
|
-------
|
|
43
73
|
datetime: A datetime object representing the parsed datetime.
|
|
44
74
|
"""
|
|
45
|
-
|
|
75
|
+
date_formats = ["%d%b%Y", "%m/%d/%Y", "%m-%d-%Y", "%Y/%m/%d", "%Y-%m-%d"]
|
|
76
|
+
time_formats = ["%H:%M:%S", "%H%M"]
|
|
77
|
+
datetime_formats = [
|
|
78
|
+
f"{date} {time}" for date in date_formats for time in time_formats
|
|
79
|
+
]
|
|
46
80
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
parsed_dt += timedelta(days=1)
|
|
51
|
-
else:
|
|
52
|
-
parsed_dt = datetime.strptime(datetime_str, datetime_format)
|
|
81
|
+
is_2400 = datetime_str.endswith((" 24:00:00", " 2400", " 24:00"))
|
|
82
|
+
if is_2400:
|
|
83
|
+
datetime_str = datetime_str.split()[0] + " 00:00:00"
|
|
53
84
|
|
|
54
|
-
|
|
85
|
+
last_exception = None
|
|
86
|
+
for fmt in datetime_formats:
|
|
87
|
+
try:
|
|
88
|
+
parsed_dt = datetime.strptime(datetime_str, fmt)
|
|
89
|
+
if is_2400:
|
|
90
|
+
parsed_dt += timedelta(days=1)
|
|
91
|
+
return parsed_dt
|
|
92
|
+
except ValueError as e:
|
|
93
|
+
last_exception = e
|
|
94
|
+
continue
|
|
95
|
+
|
|
96
|
+
raise ValueError(f"Invalid date format: {datetime_str}") from last_exception
|
|
55
97
|
|
|
56
98
|
|
|
99
|
+
@deprecated
|
|
57
100
|
def parse_ras_simulation_window_datetime(datetime_str) -> datetime:
|
|
58
101
|
"""
|
|
59
102
|
Parse a datetime string from a RAS simulation window into a datetime object.
|
|
@@ -139,32 +182,37 @@ def convert_ras_hdf_string(
|
|
|
139
182
|
a list of datetime strings, a timedelta objects, or the original string
|
|
140
183
|
if no other conditions are met.
|
|
141
184
|
"""
|
|
142
|
-
ras_datetime_format1_re = r"\d{2}\w{3}\d{4} \d{2}:\d{2}:\d{2}"
|
|
143
|
-
ras_datetime_format2_re = r"\d{2}\w{3}\d{4} \d{2}\d{2}"
|
|
144
185
|
ras_duration_format_re = r"\d{2}:\d{2}:\d{2}"
|
|
186
|
+
date_patterns_re = [
|
|
187
|
+
r"\d{2}\w{3}\d{4}",
|
|
188
|
+
r"\d{2}/\d{2}/\d{4}",
|
|
189
|
+
r"\d{2}-\d{2}-\d{4}",
|
|
190
|
+
r"\d{4}/\d{2}/\d{2}",
|
|
191
|
+
r"\d{4}-\d{2}-\d{2}",
|
|
192
|
+
]
|
|
193
|
+
time_patterns_re = [
|
|
194
|
+
r"\d{2}:\d{2}:\d{2}",
|
|
195
|
+
r"\d{4}",
|
|
196
|
+
]
|
|
197
|
+
datetime_patterns_re = [
|
|
198
|
+
f"{date} {time}" for date in date_patterns_re for time in time_patterns_re
|
|
199
|
+
]
|
|
145
200
|
s = value.decode("utf-8")
|
|
146
201
|
if s == "True":
|
|
147
202
|
return True
|
|
148
203
|
elif s == "False":
|
|
149
204
|
return False
|
|
150
|
-
elif re.match(rf"^{ras_datetime_format1_re}", s):
|
|
151
|
-
if re.match(rf"^{ras_datetime_format1_re} to {ras_datetime_format1_re}$", s):
|
|
152
|
-
split = s.split(" to ")
|
|
153
|
-
return [
|
|
154
|
-
parse_ras_datetime(split[0]),
|
|
155
|
-
parse_ras_datetime(split[1]),
|
|
156
|
-
]
|
|
157
|
-
return parse_ras_datetime(s)
|
|
158
|
-
elif re.match(rf"^{ras_datetime_format2_re}", s):
|
|
159
|
-
if re.match(rf"^{ras_datetime_format2_re} to {ras_datetime_format2_re}$", s):
|
|
160
|
-
split = s.split(" to ")
|
|
161
|
-
return [
|
|
162
|
-
parse_ras_simulation_window_datetime(split[0]),
|
|
163
|
-
parse_ras_simulation_window_datetime(split[1]),
|
|
164
|
-
]
|
|
165
|
-
return parse_ras_simulation_window_datetime(s)
|
|
166
205
|
elif re.match(rf"^{ras_duration_format_re}$", s):
|
|
167
206
|
return parse_duration(s)
|
|
207
|
+
for dt_re in datetime_patterns_re:
|
|
208
|
+
if re.match(rf"^{dt_re}", s):
|
|
209
|
+
if re.match(rf"^{dt_re} to {dt_re}$", s):
|
|
210
|
+
start, end = s.split(" to ")
|
|
211
|
+
return [
|
|
212
|
+
parse_ras_datetime(start),
|
|
213
|
+
parse_ras_datetime(end),
|
|
214
|
+
]
|
|
215
|
+
return parse_ras_datetime(s)
|
|
168
216
|
return s
|
|
169
217
|
|
|
170
218
|
|
|
@@ -306,33 +354,3 @@ def ras_timesteps_to_datetimes(
|
|
|
306
354
|
start_time + pd.Timedelta(timestep, unit=time_unit).round(round_to)
|
|
307
355
|
for timestep in timesteps.astype(np.float64)
|
|
308
356
|
]
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
def deprecated(func) -> Callable:
|
|
312
|
-
"""
|
|
313
|
-
Deprecate a function.
|
|
314
|
-
|
|
315
|
-
This is a decorator which can be used to mark functions as deprecated.
|
|
316
|
-
It will result in a warning being emitted when the function is used.
|
|
317
|
-
|
|
318
|
-
Parameters
|
|
319
|
-
----------
|
|
320
|
-
func: The function to be deprecated.
|
|
321
|
-
|
|
322
|
-
Returns
|
|
323
|
-
-------
|
|
324
|
-
The decorated function.
|
|
325
|
-
"""
|
|
326
|
-
|
|
327
|
-
def new_func(*args, **kwargs):
|
|
328
|
-
warnings.warn(
|
|
329
|
-
f"{func.__name__} is deprecated and will be removed in a future version.",
|
|
330
|
-
category=DeprecationWarning,
|
|
331
|
-
stacklevel=2,
|
|
332
|
-
)
|
|
333
|
-
return func(*args, **kwargs)
|
|
334
|
-
|
|
335
|
-
new_func.__name__ = func.__name__
|
|
336
|
-
new_func.__doc__ = func.__doc__
|
|
337
|
-
new_func.__dict__.update(func.__dict__)
|
|
338
|
-
return new_func
|
|
@@ -35,7 +35,51 @@ def test_convert_ras_hdf_value():
|
|
|
35
35
|
assert utils.convert_ras_hdf_value(b"15Mar2024 2315") == datetime(
|
|
36
36
|
2024, 3, 15, 23, 15, 0
|
|
37
37
|
)
|
|
38
|
-
|
|
38
|
+
assert utils.convert_ras_hdf_value(b"15Mar2024 2400") == datetime(
|
|
39
|
+
2024, 3, 16, 0, 0, 0
|
|
40
|
+
)
|
|
41
|
+
assert utils.convert_ras_hdf_value(b"03/15/2024 2400") == datetime(
|
|
42
|
+
2024, 3, 16, 0, 0, 0
|
|
43
|
+
)
|
|
44
|
+
assert utils.convert_ras_hdf_value(b"03-15-2024 2400") == datetime(
|
|
45
|
+
2024, 3, 16, 0, 0, 0
|
|
46
|
+
)
|
|
47
|
+
assert utils.convert_ras_hdf_value(b"2024/03/15 2400") == datetime(
|
|
48
|
+
2024, 3, 16, 0, 0, 0
|
|
49
|
+
)
|
|
50
|
+
assert utils.convert_ras_hdf_value(b"2024-03-15 2400") == datetime(
|
|
51
|
+
2024, 3, 16, 0, 0, 0
|
|
52
|
+
)
|
|
53
|
+
assert utils.convert_ras_hdf_value(b"15Mar2024 0000") == datetime(
|
|
54
|
+
2024, 3, 15, 0, 0, 0
|
|
55
|
+
)
|
|
56
|
+
assert utils.convert_ras_hdf_value(b"03/15/2024 0000") == datetime(
|
|
57
|
+
2024, 3, 15, 0, 0, 0
|
|
58
|
+
)
|
|
59
|
+
assert utils.convert_ras_hdf_value(b"03-15-2024 0000") == datetime(
|
|
60
|
+
2024, 3, 15, 0, 0, 0
|
|
61
|
+
)
|
|
62
|
+
assert utils.convert_ras_hdf_value(b"2024/03/15 0000") == datetime(
|
|
63
|
+
2024, 3, 15, 0, 0, 0
|
|
64
|
+
)
|
|
65
|
+
assert utils.convert_ras_hdf_value(b"2024-03-15 0000") == datetime(
|
|
66
|
+
2024, 3, 15, 0, 0, 0
|
|
67
|
+
)
|
|
68
|
+
assert utils.convert_ras_hdf_value(b"15Mar2024 23:59:59") == datetime(
|
|
69
|
+
2024, 3, 15, 23, 59, 59
|
|
70
|
+
)
|
|
71
|
+
assert utils.convert_ras_hdf_value(b"03/15/2024 23:59:59") == datetime(
|
|
72
|
+
2024, 3, 15, 23, 59, 59
|
|
73
|
+
)
|
|
74
|
+
assert utils.convert_ras_hdf_value(b"03-15-2024 23:59:59") == datetime(
|
|
75
|
+
2024, 3, 15, 23, 59, 59
|
|
76
|
+
)
|
|
77
|
+
assert utils.convert_ras_hdf_value(b"2024/03/15 23:59:59") == datetime(
|
|
78
|
+
2024, 3, 15, 23, 59, 59
|
|
79
|
+
)
|
|
80
|
+
assert utils.convert_ras_hdf_value(b"2024-03-15 23:59:59") == datetime(
|
|
81
|
+
2024, 3, 15, 23, 59, 59
|
|
82
|
+
)
|
|
39
83
|
assert utils.convert_ras_hdf_value(b"15Mar2024 1639 to 16Mar2024 1639") == [
|
|
40
84
|
datetime(2024, 3, 15, 16, 39, 0),
|
|
41
85
|
datetime(2024, 3, 16, 16, 39, 0),
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|