def _validate_setitem_value(self, value): """ Check if we have a scalar that we can cast losslessly. Raises ------ TypeError """ kind = self.dtype.kind # TODO: get this all from np_can_hold_element? if kind == "b": if lib.is_bool(value): return value elif kind == "f": if lib.is_integer(value) or lib.is_float(value): return value else: if lib.is_integer(value) or (lib.is_float(value) and value.is_integer()): return value # TODO: unsigned checks # Note: without the "str" here, the f-string rendering raises in # py38 builds. raise TypeError(f"Invalid value '{str(value)}' for dtype {self.dtype}")
def is_valid_na_for_dtype(obj, dtype: DtypeObj) -> bool: """ isna check that excludes incompatible dtypes Parameters ---------- obj : object dtype : np.datetime64, np.timedelta64, DatetimeTZDtype, or PeriodDtype Returns ------- bool """ if not lib.is_scalar(obj) or not isna(obj): return False elif dtype.kind == "M": if isinstance(dtype, np.dtype): # i.e. not tzaware return not isinstance(obj, (np.timedelta64, Decimal)) # we have to rule out tznaive dt64("NaT") return not isinstance(obj, (np.timedelta64, np.datetime64, Decimal)) elif dtype.kind == "m": return not isinstance(obj, (np.datetime64, Decimal)) elif dtype.kind in ["i", "u", "f", "c"]: # Numeric return obj is not NaT and not isinstance( obj, (np.datetime64, np.timedelta64)) elif dtype.kind == "b": # We allow pd.NA, None, np.nan in BooleanArray (same as IntervalDtype) return lib.is_float(obj) or obj is None or obj is libmissing.NA elif dtype == _dtype_str: # numpy string dtypes to avoid float np.nan return not isinstance(obj, (np.datetime64, np.timedelta64, Decimal, float)) elif dtype == _dtype_object: # This is needed for Categorical, but is kind of weird return True elif isinstance(dtype, PeriodDtype): return not isinstance(obj, (np.datetime64, np.timedelta64, Decimal)) elif isinstance(dtype, IntervalDtype): return lib.is_float(obj) or obj is None or obj is libmissing.NA elif isinstance(dtype, CategoricalDtype): return is_valid_na_for_dtype(obj, dtype.categories.dtype) # fallback, default to allowing NaN, None, NA, NaT return not isinstance(obj, (np.datetime64, np.timedelta64, Decimal))
def __new__(cls, values, freq=None, start=None, end=None, periods=None, closed=None): if (freq is not None and not isinstance(freq, DateOffset) and freq != 'infer'): freq = to_offset(freq) if periods is not None: if lib.is_float(periods): periods = int(periods) elif not lib.is_integer(periods): raise TypeError('`periods` must be a number, got {periods}' .format(periods=periods)) if values is None: if freq is None and com._any_none(periods, start, end): raise ValueError('Must provide freq argument if no data is ' 'supplied') else: return cls._generate(start, end, periods, freq, closed=closed) result = cls._simple_new(values, freq=freq) if freq == 'infer': inferred = result.inferred_freq if inferred: result._freq = to_offset(inferred) return result
def cast_scalar_indexer(val, warn_float: bool = False): """ To avoid numpy DeprecationWarnings, cast float to integer where valid. Parameters ---------- val : scalar warn_float : bool, default False If True, issue deprecation warning for a float indexer. Returns ------- outval : scalar """ # assumes lib.is_scalar(val) if lib.is_float(val) and val.is_integer(): if warn_float: warnings.warn( "Indexing with a float is deprecated, and will raise an IndexError " "in pandas 2.0. You can manually convert to an integer key instead.", FutureWarning, stacklevel=3, ) return int(val) return val
def validate_periods(periods): """ If a `periods` argument is passed to the Datetime/Timedelta Array/Index constructor, cast it to an integer. Parameters ---------- periods : None, float, int Returns ------- periods : None or int Raises ------ TypeError if periods is None, float, or int """ if periods is not None: if lib.is_float(periods): periods = int(periods) elif not lib.is_integer(periods): raise TypeError('periods must be a number, got {periods}'.format( periods=periods)) return periods
def __new__(cls, values, freq=None, start=None, end=None, periods=None, closed=None): if (freq is not None and not isinstance(freq, DateOffset) and freq != 'infer'): freq = to_offset(freq) if periods is not None: if lib.is_float(periods): periods = int(periods) elif not lib.is_integer(periods): raise TypeError( '`periods` must be a number, got {periods}'.format( periods=periods)) if values is None: if freq is None and com._any_none(periods, start, end): raise ValueError('Must provide freq argument if no data is ' 'supplied') else: return cls._generate(start, end, periods, freq, closed=closed) result = cls._simple_new(values, freq=freq) if freq == 'infer': inferred = result.inferred_freq if inferred: result._freq = to_offset(inferred) return result
def validate_periods(periods): """ If a `periods` argument is passed to the Datetime/Timedelta Array/Index constructor, cast it to an integer. Parameters ---------- periods : None, float, int Returns ------- periods : None or int Raises ------ TypeError if periods is None, float, or int """ if periods is not None: if lib.is_float(periods): periods = int(periods) elif not lib.is_integer(periods): raise TypeError('periods must be a number, got {periods}' .format(periods=periods)) return periods
def _validate_setitem_value(self, value): """ Check if we have a scalar that we can cast losslessly. Raises ------ TypeError """ kind = self.dtype.kind # TODO: get this all from np_can_hold_element? if kind == "b": if lib.is_bool(value): return value elif kind == "f": if lib.is_integer(value) or lib.is_float(value): return value else: if lib.is_integer(value) or (lib.is_float(value) and value.is_integer()): return value # TODO: unsigned checks raise TypeError(f"Invalid value '{value}' for dtype {self.dtype}")
def cast_scalar_indexer(val): """ To avoid numpy DeprecationWarnings, cast float to integer where valid. Parameters ---------- val : scalar Returns ------- outval : scalar """ # assumes lib.is_scalar(val) if lib.is_float(val) and val == int(val): return int(val) return val
def raise_for_nan(value, method: str): if lib.is_float(value) and np.isnan(value): raise ValueError( f"Cannot perform logical '{method}' with floating NaN")