From fb3ef1f7f4b5961116cb1a30d19f026e50a8b9aa Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Thu, 2 Apr 2020 16:34:52 -0700 Subject: [PATCH 1/2] REF: dispatch DatetimeBlock.to_native_types to DatetimeArray._format_native_types --- pandas/core/arrays/datetimes.py | 4 ++-- pandas/core/internals/blocks.py | 23 +++++++---------------- pandas/io/formats/format.py | 2 +- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index 741290a4908a5..be2ac8c22bc8a 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -613,8 +613,8 @@ def _format_native_types(self, na_rep="NaT", date_format=None, **kwargs): fmt = _get_format_datetime64_from_values(self, date_format) return tslib.format_array_from_datetime( - self.asi8, tz=self.tz, format=fmt, na_rep=na_rep - ) + self.asi8.ravel(), tz=self.tz, format=fmt, na_rep=na_rep + ).reshape(self.shape) # ----------------------------------------------------------------- # Comparison Methods diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 8e2592a603716..a14b8a2c80e1d 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -6,7 +6,7 @@ import numpy as np -from pandas._libs import NaT, Timestamp, algos as libalgos, lib, tslib, writers +from pandas._libs import NaT, Timestamp, algos as libalgos, lib, writers import pandas._libs.internals as libinternals from pandas._libs.tslibs import Timedelta, conversion from pandas._libs.tslibs.timezones import tz_compare @@ -2131,27 +2131,18 @@ def _can_hold_element(self, element: Any) -> bool: return is_valid_nat_for_dtype(element, self.dtype) - def to_native_types( - self, slicer=None, na_rep=None, date_format=None, quoting=None, **kwargs - ): + # TODO: should na_rep default to "NaT"? + def to_native_types(self, slicer=None, na_rep=None, date_format=None, **kwargs): """ convert to our native types format, slicing if desired """ values = self.values - i8values = self.values.view("i8") - if slicer is not None: values = values[..., slicer] - i8values = i8values[..., slicer] - from pandas.io.formats.format import _get_format_datetime64_from_values + dta = self._holder(values) - fmt = _get_format_datetime64_from_values(values, date_format) - - result = tslib.format_array_from_datetime( - i8values.ravel(), - tz=getattr(self.values, "tz", None), - format=fmt, - na_rep=na_rep, - ).reshape(i8values.shape) + result = dta._format_native_types( + na_rep=na_rep, date_format=date_format, **kwargs + ) return np.atleast_2d(result) def set(self, locs, values): diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index 17cc897136aad..a9e668312d751 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -1547,7 +1547,7 @@ def _is_dates_only( values: Union[np.ndarray, DatetimeArray, Index, DatetimeIndex] ) -> bool: # return a boolean if we are only dates (and don't have a timezone) - assert values.ndim == 1 + values = values.ravel() values = DatetimeIndex(values) if values.tz is not None: From 474d5f25a9600a77348059a562862debefe90ecf Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Thu, 2 Apr 2020 17:42:45 -0700 Subject: [PATCH 2/2] Change default na_rep --- pandas/core/internals/blocks.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index a14b8a2c80e1d..15bfadc9bed27 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -2131,8 +2131,7 @@ def _can_hold_element(self, element: Any) -> bool: return is_valid_nat_for_dtype(element, self.dtype) - # TODO: should na_rep default to "NaT"? - def to_native_types(self, slicer=None, na_rep=None, date_format=None, **kwargs): + def to_native_types(self, slicer=None, na_rep="NaT", date_format=None, **kwargs): """ convert to our native types format, slicing if desired """ values = self.values if slicer is not None: