parameters: (arr, dtype, copy: bool = True, skipna: bool = False)
return_statement: return arr.view(dtype)
docstring: Cast the elements of an array to a given dtype a nan-safe manner.
  
      Parameters
      ----------
      arr : ndarray
      dtype : np.dtype
      copy : bool, default True
          If False, a view will be attempted but may fail, if
          e.g. the item sizes don't align.
      skipna: bool, default False
          Whether or not we should skip NaN when casting as a string-type.
  
      Raises
      ------
      ValueError
          The dtype was a datetime64/timedelta64 dtype, but it had no unit.
docstring_summary: Cast the elements of an array to a given dtype a nan-safe manner.
docstring_tokens: Cast the elements of an array to a given dtype a nan - safe manner .
function: def astype_nansafe(arr, dtype, copy: bool = True, skipna: bool = False):
      """
      Cast the elements of an array to a given dtype a nan-safe manner.
  
      Parameters
      ----------
      arr : ndarray
      dtype : np.dtype
      copy : bool, default True
          If False, a view will be attempted but may fail, if
          e.g. the item sizes don't align.
      skipna: bool, default False
          Whether or not we should skip NaN when casting as a string-type.
  
      Raises
      ------
      ValueError
          The dtype was a datetime64/timedelta64 dtype, but it had no unit.
      """
  
      # dispatch on extension dtype if needed
      if is_extension_array_dtype(dtype):
          return dtype.construct_array_type()._from_sequence(arr, dtype=dtype, copy=copy)
  
      if not isinstance(dtype, np.dtype):
          dtype = pandas_dtype(dtype)
  
      if issubclass(dtype.type, str):
          return lib.astype_str(arr.ravel(), skipna=skipna).reshape(arr.shape)
  
      elif is_datetime64_dtype(arr):
          if is_object_dtype(dtype):
              return tslib.ints_to_pydatetime(arr.view(np.int64))
          elif dtype == np.int64:
              if isna(arr).any():
                  raise ValueError("Cannot convert NaT values to integer")
              return arr.view(dtype)
  
          # allow frequency conversions
          if dtype.kind == "M":
              return arr.astype(dtype)
  
          raise TypeError(f"cannot astype a datetimelike from [{arr.dtype}] to [{dtype}]")
  
      elif is_timedelta64_dtype(arr):
          if is_object_dtype(dtype):
              return tslibs.ints_to_pytimedelta(arr.view(np.int64))
          elif dtype == np.int64:
              if isna(arr).any():
                  raise ValueError("Cannot convert NaT values to integer")
              return arr.view(dtype)
  
          if dtype not in [_INT64_DTYPE, _TD_DTYPE]:
  
              # allow frequency conversions
              # we return a float here!
              if dtype.kind == "m":
                  mask = isna(arr)
                  result = arr.astype(dtype).astype(np.float64)
                  result[mask] = np.nan
                  return result
          elif dtype == _TD_DTYPE:
              return arr.astype(_TD_DTYPE, copy=copy)
  
          raise TypeError(f"cannot astype a timedelta from [{arr.dtype}] to [{dtype}]")
  
      elif np.issubdtype(arr.dtype, np.floating) and np.issubdtype(dtype, np.integer):
  
          if not np.isfinite(arr).all():
              raise ValueError("Cannot convert non-finite values (NA or inf) to integer")
  
      elif is_object_dtype(arr):
  
          # work around NumPy brokenness, #1987
          if np.issubdtype(dtype.type, np.integer):
              return lib.astype_intsafe(arr.ravel(), dtype).reshape(arr.shape)
  
          # if we have a datetime/timedelta array of objects
          # then coerce to a proper dtype and recall astype_nansafe
  
          elif is_datetime64_dtype(dtype):
              from pandas import to_datetime
  
              return astype_nansafe(to_datetime(arr).values, dtype, copy=copy)
          elif is_timedelta64_dtype(dtype):
              from pandas import to_timedelta
  
              return astype_nansafe(to_timedelta(arr).values, dtype, copy=copy)
  
      if dtype.name in ("datetime64", "timedelta64"):
          msg = (
              f"The '{dtype.name}' dtype has no unit. Please pass in "
              f"'{dtype.name}[ns]' instead."
          )
          raise ValueError(msg)
  
      if copy or is_object_dtype(arr) or is_object_dtype(dtype):
          # Explicit copy, or required since NumPy can't view from / to object.
          return arr.astype(dtype, copy=True)
  
      return arr.view(dtype)
function_tokens: def astype_nansafe ( arr , dtype , copy : bool = True , skipna : bool = False ) : # dispatch on extension dtype if needed if is_extension_array_dtype ( dtype ) : return dtype . construct_array_type ( ) . _from_sequence ( arr , dtype = dtype , copy = copy ) if not isinstance ( dtype , np . dtype ) : dtype = pandas_dtype ( dtype ) if issubclass ( dtype . type , str ) : return lib . astype_str ( arr . ravel ( ) , skipna = skipna ) . reshape ( arr . shape ) elif is_datetime64_dtype ( arr ) : if is_object_dtype ( dtype ) : return tslib . ints_to_pydatetime ( arr . view ( np . int64 ) ) elif dtype == np . int64 : if isna ( arr ) . any ( ) : raise ValueError ( "Cannot convert NaT values to integer" ) return arr . view ( dtype ) # allow frequency conversions if dtype . kind == "M" : return arr . astype ( dtype ) raise TypeError ( f"cannot astype a datetimelike from [{arr.dtype}] to [{dtype}]" ) elif is_timedelta64_dtype ( arr ) : if is_object_dtype ( dtype ) : return tslibs . ints_to_pytimedelta ( arr . view ( np . int64 ) ) elif dtype == np . int64 : if isna ( arr ) . any ( ) : raise ValueError ( "Cannot convert NaT values to integer" ) return arr . view ( dtype ) if dtype not in [ _INT64_DTYPE , _TD_DTYPE ] : # allow frequency conversions # we return a float here! if dtype . kind == "m" : mask = isna ( arr ) result = arr . astype ( dtype ) . astype ( np . float64 ) result [ mask ] = np . nan return result elif dtype == _TD_DTYPE : return arr . astype ( _TD_DTYPE , copy = copy ) raise TypeError ( f"cannot astype a timedelta from [{arr.dtype}] to [{dtype}]" ) elif np . issubdtype ( arr . dtype , np . floating ) and np . issubdtype ( dtype , np . integer ) : if not np . isfinite ( arr ) . all ( ) : raise ValueError ( "Cannot convert non-finite values (NA or inf) to integer" ) elif is_object_dtype ( arr ) : # work around NumPy brokenness, #1987 if np . issubdtype ( dtype . type , np . integer ) : return lib . astype_intsafe ( arr . ravel ( ) , dtype ) . reshape ( arr . shape ) # if we have a datetime/timedelta array of objects # then coerce to a proper dtype and recall astype_nansafe elif is_datetime64_dtype ( dtype ) : from pandas import to_datetime return astype_nansafe ( to_datetime ( arr ) . values , dtype , copy = copy ) elif is_timedelta64_dtype ( dtype ) : from pandas import to_timedelta return astype_nansafe ( to_timedelta ( arr ) . values , dtype , copy = copy ) if dtype . name in ( "datetime64" , "timedelta64" ) : msg = ( f"The '{dtype.name}' dtype has no unit. Please pass in " f"'{dtype.name}[ns]' instead." ) raise ValueError ( msg ) if copy or is_object_dtype ( arr ) or is_object_dtype ( dtype ) : # Explicit copy, or required since NumPy can't view from / to object. return arr . astype ( dtype , copy = True ) return arr . view ( dtype )