|
17 | 17 | from pandas.util._decorators import Appender, Substitution, deprecate_kwarg
|
18 | 18 |
|
19 | 19 | from pandas.core.dtypes.common import (
|
20 |
| - is_bool_dtype, is_datetime64_any_dtype, is_datetime64_dtype, |
21 |
| - is_datetime64tz_dtype, is_extension_array_dtype, is_float_dtype, |
22 |
| - is_integer_dtype, is_list_like, is_object_dtype, is_offsetlike, |
23 |
| - is_period_dtype, is_timedelta64_dtype, needs_i8_conversion) |
| 20 | + is_bool_dtype, is_categorical_dtype, is_datetime64_any_dtype, |
| 21 | + is_datetime64_dtype, is_datetime64tz_dtype, is_datetime_or_timedelta_dtype, |
| 22 | + is_dtype_equal, is_extension_array_dtype, is_float_dtype, is_integer_dtype, |
| 23 | + is_list_like, is_object_dtype, is_offsetlike, is_period_dtype, |
| 24 | + is_string_dtype, is_timedelta64_dtype, is_unsigned_integer_dtype, |
| 25 | + needs_i8_conversion, pandas_dtype) |
24 | 26 | from pandas.core.dtypes.generic import ABCDataFrame, ABCIndexClass, ABCSeries
|
25 | 27 | from pandas.core.dtypes.missing import isna
|
26 | 28 |
|
@@ -315,7 +317,7 @@ def _ndarray_values(self):
|
315 | 317 | # ----------------------------------------------------------------
|
316 | 318 | # Rendering Methods
|
317 | 319 |
|
318 |
| - def _format_native_types(self, na_rep=u'NaT', date_format=None): |
| 320 | + def _format_native_types(self, na_rep='NaT', date_format=None): |
319 | 321 | """
|
320 | 322 | Helper method for astype when converting to strings.
|
321 | 323 |
|
@@ -403,9 +405,54 @@ def __getitem__(self, key):
|
403 | 405 | return self._simple_new(result, **attribs)
|
404 | 406 |
|
405 | 407 | def astype(self, dtype, copy=True):
|
| 408 | + # Some notes on cases we don't have to handle here in the base class: |
| 409 | + # 1. PeriodArray.astype handles period -> period |
| 410 | + # 2. DatetimeArray.astype handles conversion between tz. |
| 411 | + # 3. DatetimeArray.astype handles datetime -> period |
| 412 | + from pandas import Categorical |
| 413 | + dtype = pandas_dtype(dtype) |
| 414 | + |
406 | 415 | if is_object_dtype(dtype):
|
407 | 416 | return self._box_values(self.asi8)
|
408 |
| - return super(DatetimeLikeArrayMixin, self).astype(dtype, copy) |
| 417 | + elif is_string_dtype(dtype) and not is_categorical_dtype(dtype): |
| 418 | + return self._format_native_types() |
| 419 | + elif is_integer_dtype(dtype): |
| 420 | + # we deliberately ignore int32 vs. int64 here. |
| 421 | + # See https://github.com/pandas-dev/pandas/issues/24381 for more. |
| 422 | + values = self.asi8 |
| 423 | + |
| 424 | + if is_unsigned_integer_dtype(dtype): |
| 425 | + # Again, we ignore int32 vs. int64 |
| 426 | + values = values.view("uint64") |
| 427 | + |
| 428 | + if copy: |
| 429 | + values = values.copy() |
| 430 | + return values |
| 431 | + elif (is_datetime_or_timedelta_dtype(dtype) and |
| 432 | + not is_dtype_equal(self.dtype, dtype)) or is_float_dtype(dtype): |
| 433 | + # disallow conversion between datetime/timedelta, |
| 434 | + # and conversions for any datetimelike to float |
| 435 | + msg = 'Cannot cast {name} to dtype {dtype}' |
| 436 | + raise TypeError(msg.format(name=type(self).__name__, dtype=dtype)) |
| 437 | + elif is_categorical_dtype(dtype): |
| 438 | + return Categorical(self, dtype=dtype) |
| 439 | + else: |
| 440 | + return np.asarray(self, dtype=dtype) |
| 441 | + |
| 442 | + def view(self, dtype=None): |
| 443 | + """ |
| 444 | + New view on this array with the same data. |
| 445 | +
|
| 446 | + Parameters |
| 447 | + ---------- |
| 448 | + dtype : numpy dtype, optional |
| 449 | +
|
| 450 | + Returns |
| 451 | + ------- |
| 452 | + ndarray |
| 453 | + With the specified `dtype`. |
| 454 | + """ |
| 455 | + return self._data.view(dtype=dtype) |
409 | 456 |
|
410 | 457 | # ------------------------------------------------------------------
|
411 | 458 | # ExtensionArray Interface
|
|
0 commit comments