Source code for tstore.archive.checks
#!/usr/bin/env python3
"""
Created on Mon Jun 12 21:32:37 2023.
@author: ghiggi
"""
import datetime
import numpy as np
[docs]
def check_is_tstore(base_dir):
"""Check is a TStore."""
# TODO
pass
return base_dir
[docs]
def get_available_ts_variables(base_dir):
"""Get available TStore timeseries."""
from tstore.archive.metadata.readers import read_tstore_metadata
metadata = read_tstore_metadata(base_dir=base_dir)
return metadata["ts_variables"]
[docs]
def check_ts_variables(ts_variables, base_dir):
"""Check valid ts_variables.
If None, return all the available ts_variables.
"""
available_ts_variables = get_available_ts_variables(base_dir)
if isinstance(ts_variables, str):
ts_variables = [ts_variables]
if isinstance(ts_variables, type(None)):
ts_variables = available_ts_variables
ts_variables = np.array(ts_variables)
unvalid_ts_variables = ts_variables[np.isin(ts_variables, available_ts_variables, invert=True)]
ts_variables = ts_variables.tolist()
unvalid_ts_variables = unvalid_ts_variables.tolist()
if len(unvalid_ts_variables) > 0:
raise ValueError(
f"Valid ts_variables are {available_ts_variables}. Invalid: {unvalid_ts_variables}.",
)
return ts_variables
[docs]
def check_tstore_ids(
tstore_ids,
base_dir, # noqa: ARG001
):
"""Check valid tstore_ids.
If tstore_ids=None, return None.
"""
# get_available_ts_store_ids(base_dir) # look into disk (based on tstore_structure)
# TODO:
pass
return tstore_ids
[docs]
def check_time(time):
"""Check time validity.
It returns a datetime.datetime object.
Parameters
----------
time : (datetime.datetime, datetime.date, np.datetime64, str)
Time object.
Accepted types: datetime.datetime, datetime.date, np.datetime64, str
If string type, it expects the isoformat 'YYYY-MM-DD hh:mm:ss'.
Returns
-------
time : datetime.datetime
datetime.datetime object.
"""
# TODO: adapt to return the more appropriate object !!!
if not isinstance(
time,
(datetime.datetime, datetime.date, np.datetime64, np.ndarray, str),
):
raise TypeError(
"Specify time with datetime.datetime objects or a " "string of format 'YYYY-MM-DD hh:mm:ss'.",
)
# If numpy array with datetime64 (and size=1)
if isinstance(time, np.ndarray):
if np.issubdtype(time.dtype, np.datetime64):
if time.size == 1:
time = time.astype("datetime64[ns]").tolist()
else:
raise ValueError("Expecting a single timestep!")
else:
raise ValueError("The numpy array does not have a np.datetime64 dtype!")
# If np.datetime64, convert to datetime.datetime
if isinstance(time, np.datetime64):
time = time.astype("datetime64[s]").tolist()
# If datetime.date, convert to datetime.datetime
if not isinstance(time, (datetime.datetime, str)):
time = datetime.datetime(time.year, time.month, time.day, 0, 0, 0)
if isinstance(time, str):
try:
time = datetime.datetime.fromisoformat(time)
except ValueError:
raise ValueError("The time string must have format 'YYYY-MM-DD hh:mm:ss'")
return time
[docs]
def check_start_end_time(start_time, end_time):
"""Check start_time and end_time validity."""
# Format time input
if start_time is not None:
start_time = check_time(start_time)
if end_time is not None:
end_time = check_time(end_time)
# Check start_time and end_time are chronological
if start_time is not None and end_time is not None and start_time > end_time:
raise ValueError("Provide start_time occurring before of end_time")
return (start_time, end_time)