Skip to content
Snippets Groups Projects
Commit d0fd0633 authored by BRONES Romain's avatar BRONES Romain
Browse files

Improve boolean casting

* Now usable for GetNearest
parent 951bce18
Branches
Tags
No related merge requests found
......@@ -42,6 +42,13 @@ _DBDFMT2 = "%d-%m-%Y %H:%M:%S"
# NOTE: it is faster than using pandas.to_datetime()
_ArrayTimeStampToDatetime = np.vectorize(datetime.datetime.fromtimestamp)
# Vectorized bool map dictionnary
_ArrayStr2Bool = np.vectorize({
"true":True, 't':True,
"false":False, 'f':False,
}.get)
def _check_initialized():
"""
Check if the module is initialized.
......@@ -243,6 +250,48 @@ def _cmd_with_retry(dp, cmd, arg, retry=2):
break
return cmdreturn
def _cast_bool(value):
"""
Cast a value, or array of values, to boolean.
Try to assess the input data type. If string, then try to find true or false word inside.
Parameters:
-----------
value: string, integer, or array of such
value to convert.
Return:
boolean:
value or array of boolean.
"""
# Force to array
value = np.asarray(value)
# cast back to single value
def castback(v):
if v.shape == ():
return v.item()
return v
# Simply try to cast to bool first
try:
value = value.astype("bool")
logger.debug("Direct conversion to boolean")
return castback(value)
except ValueError:
# Keep trying to cast
pass
logger.debug("Try to convert to boolean")
value = np.char.strip(np.char.lower(value))
value = _ArrayStr2Bool(value)
return castback(value)
##########################################################################
### Module private variables ###
##########################################################################
......@@ -547,8 +596,12 @@ def _extract_scalar(attribute, method, date1, date2, db, dtype):
logger.error("Could not extract this chunk. Check the device extractor")
return None
# Transform by datatype
if dtype is bool:
_value = _cast_bool(_value)
# Fabricate return pandas.Series
d=pd.Series(index=[datetime.datetime.fromtimestamp(int(_date)/1000),], data=[float(_value),], name=attribute)
d=pd.Series(index=[datetime.datetime.fromtimestamp(int(_date)/1000),], data=[_value,], name=attribute)
return d
......@@ -579,7 +632,7 @@ def _extract_scalar(attribute, method, date1, date2, db, dtype):
# Transform to datetime - value arrays
if dtype is bool:
_value = np.asarray([{"true":True, "false":False}[_a.lower()] for _a in _value])
_value = _cast_bool(_value)
else:
_value = np.asarray(_value, dtype=dtype)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment