in amplify/backend/function/iamxawswrangler/lib/python/pandas/_libs/lib.pyx [0:0]
def maybe_convert_objects(ndarray[object] objects,
*,
bint try_float=False,
bint safe=False,
bint convert_datetime=False,
bint convert_timedelta=False,
bint convert_period=False,
bint convert_interval=False,
bint convert_to_nullable_integer=False,
object dtype_if_all_nat=None) -> "ArrayLike":
"""
Type inference function-- convert object array to proper dtype
Parameters
----------
objects : ndarray[object]
Array of object elements to convert.
try_float : bool, default False
If an array-like object contains only float or NaN values is
encountered, whether to convert and return an array of float dtype.
safe : bool, default False
Whether to upcast numeric type (e.g. int cast to float). If set to
True, no upcasting will be performed.
convert_datetime : bool, default False
If an array-like object contains only datetime values or NaT is
encountered, whether to convert and return an array of M8[ns] dtype.
convert_timedelta : bool, default False
If an array-like object contains only timedelta values or NaT is
encountered, whether to convert and return an array of m8[ns] dtype.
convert_period : bool, default False
If an array-like object contains only (homogeneous-freq) Period values
or NaT, whether to convert and return a PeriodArray.
convert_interval : bool, default False
If an array-like object contains only Interval objects (with matching
dtypes and closedness) or NaN, whether to convert to IntervalArray.
convert_to_nullable_integer : bool, default False
If an array-like object contains only integer values (and NaN) is
encountered, whether to convert and return an IntegerArray.
dtype_if_all_nat : np.dtype, ExtensionDtype, or None, default None
Dtype to cast to if we have all-NaT.
Returns
-------
np.ndarray or ExtensionArray
Array of converted object values to more specific dtypes if applicable.
"""
cdef:
Py_ssize_t i, n, itemsize_max = 0
ndarray[float64_t] floats
ndarray[complex128_t] complexes
ndarray[int64_t] ints
ndarray[uint64_t] uints
ndarray[uint8_t] bools
int64_t[:] idatetimes
int64_t[:] itimedeltas
Seen seen = Seen()
object val
float64_t fval, fnan = np.nan
n = len(objects)
floats = np.empty(n, dtype='f8')
complexes = np.empty(n, dtype='c16')
ints = np.empty(n, dtype='i8')
uints = np.empty(n, dtype='u8')
bools = np.empty(n, dtype=np.uint8)
mask = np.full(n, False)
if convert_datetime:
datetimes = np.empty(n, dtype='M8[ns]')
idatetimes = datetimes.view(np.int64)
if convert_timedelta:
timedeltas = np.empty(n, dtype='m8[ns]')
itimedeltas = timedeltas.view(np.int64)
for i in range(n):
val = objects[i]
if itemsize_max != -1:
itemsize = get_itemsize(val)
if itemsize > itemsize_max or itemsize == -1:
itemsize_max = itemsize
if val is None:
seen.null_ = True
floats[i] = complexes[i] = fnan
mask[i] = True
elif val is NaT:
seen.nat_ = True
if convert_datetime:
idatetimes[i] = NPY_NAT
if convert_timedelta:
itimedeltas[i] = NPY_NAT
if not (convert_datetime or convert_timedelta or convert_period):
seen.object_ = True
break
elif val is np.nan:
seen.nan_ = True
mask[i] = True
floats[i] = complexes[i] = val
elif util.is_bool_object(val):
seen.bool_ = True
bools[i] = val
elif util.is_float_object(val):
floats[i] = complexes[i] = val
seen.float_ = True
elif is_timedelta(val):
if convert_timedelta:
seen.timedelta_ = True
try:
itimedeltas[i] = convert_to_timedelta64(val, "ns").view("i8")
except OutOfBoundsTimedelta:
seen.object_ = True
break
break
else:
seen.object_ = True
break
elif util.is_integer_object(val):
seen.int_ = True
floats[i] = <float64_t>val
complexes[i] = <double complex>val
if not seen.null_:
val = int(val)
seen.saw_int(val)
if ((seen.uint_ and seen.sint_) or
val > oUINT64_MAX or val < oINT64_MIN):
seen.object_ = True
break
if seen.uint_:
uints[i] = val
elif seen.sint_:
ints[i] = val
else:
uints[i] = val
ints[i] = val
elif util.is_complex_object(val):
complexes[i] = val
seen.complex_ = True
elif PyDateTime_Check(val) or util.is_datetime64_object(val):
# if we have an tz's attached then return the objects
if convert_datetime:
if getattr(val, 'tzinfo', None) is not None:
seen.datetimetz_ = True
break
else:
seen.datetime_ = True
try:
idatetimes[i] = convert_to_tsobject(
val, None, None, 0, 0).value
except OutOfBoundsDatetime:
seen.object_ = True
break
else:
seen.object_ = True
break
elif is_period_object(val):
if convert_period:
seen.period_ = True
break
else:
seen.object_ = True
break
elif try_float and not isinstance(val, str):
# this will convert Decimal objects
try:
floats[i] = float(val)
complexes[i] = complex(val)
seen.float_ = True
except (ValueError, TypeError):
seen.object_ = True
break
elif is_interval(val):
if convert_interval:
seen.interval_ = True
break
else:
seen.object_ = True
break
else:
seen.object_ = True
break
# we try to coerce datetime w/tz but must all have the same tz
if seen.datetimetz_:
if is_datetime_with_singletz_array(objects):
from pandas import DatetimeIndex
dti = DatetimeIndex(objects)
# unbox to DatetimeArray
return dti._data
seen.object_ = True
elif seen.datetime_:
if is_datetime_or_datetime64_array(objects):
from pandas import DatetimeIndex
try:
dti = DatetimeIndex(objects)
except OutOfBoundsDatetime:
pass
else:
# unbox to ndarray[datetime64[ns]]
return dti._data._ndarray
seen.object_ = True
elif seen.timedelta_:
if is_timedelta_or_timedelta64_array(objects):
from pandas import TimedeltaIndex
try:
tdi = TimedeltaIndex(objects)
except OutOfBoundsTimedelta:
pass
else:
# unbox to ndarray[timedelta64[ns]]
return tdi._data._ndarray
seen.object_ = True
if seen.period_:
if is_period_array(objects):
from pandas import PeriodIndex
pi = PeriodIndex(objects)
# unbox to PeriodArray
return pi._data
seen.object_ = True
if seen.interval_:
if is_interval_array(objects):
from pandas import IntervalIndex
ii = IntervalIndex(objects)
# unbox to IntervalArray
return ii._data
seen.object_ = True
if not seen.object_:
result = None
if not safe:
if seen.null_ or seen.nan_:
if seen.is_float_or_complex:
if seen.complex_:
result = complexes
elif seen.float_:
result = floats
elif seen.int_:
if convert_to_nullable_integer:
from pandas.core.arrays import IntegerArray
result = IntegerArray(ints, mask)
else:
result = floats
elif seen.nan_:
result = floats
else:
if not seen.bool_:
if seen.datetime_:
if not seen.numeric_ and not seen.timedelta_:
result = datetimes
elif seen.timedelta_:
if not seen.numeric_:
result = timedeltas
elif seen.nat_:
if not seen.numeric_:
if convert_datetime and convert_timedelta:
dtype = dtype_if_all_nat
if dtype is not None:
# otherwise we keep object dtype
result = _infer_all_nats(
dtype, datetimes, timedeltas
)
elif convert_datetime:
result = datetimes
elif convert_timedelta:
result = timedeltas
else:
if seen.complex_:
result = complexes
elif seen.float_:
result = floats
elif seen.int_:
if seen.uint_:
result = uints
else:
result = ints
elif seen.is_bool:
result = bools.view(np.bool_)
else:
# don't cast int to float, etc.
if seen.null_:
if seen.is_float_or_complex:
if seen.complex_:
if not seen.int_:
result = complexes
elif seen.float_ or seen.nan_:
if not seen.int_:
result = floats
else:
if not seen.bool_:
if seen.datetime_:
if not seen.numeric_ and not seen.timedelta_:
result = datetimes
elif seen.timedelta_:
if not seen.numeric_:
result = timedeltas
elif seen.nat_:
if not seen.numeric_:
if convert_datetime and convert_timedelta:
dtype = dtype_if_all_nat
if dtype is not None:
# otherwise we keep object dtype
result = _infer_all_nats(
dtype, datetimes, timedeltas
)
elif convert_datetime:
result = datetimes
elif convert_timedelta:
result = timedeltas
else:
if seen.complex_:
if not seen.int_:
result = complexes
elif seen.float_ or seen.nan_:
if not seen.int_:
result = floats
elif seen.int_:
if seen.uint_:
result = uints
else:
result = ints
elif seen.is_bool and not seen.nan_:
result = bools.view(np.bool_)
if result is uints or result is ints or result is floats or result is complexes:
# cast to the largest itemsize when all values are NumPy scalars
if itemsize_max > 0 and itemsize_max != result.dtype.itemsize:
result = result.astype(result.dtype.kind + str(itemsize_max))
return result
elif result is not None:
return result
return objects