Skip to content

Commit 9871bdd

Browse files
jbrockmendeljreback
authored andcommitted
REF: Delegate more methods for DTI/TDI/PI (#30607)
1 parent 7fd85e9 commit 9871bdd

File tree

4 files changed

+27
-78
lines changed

4 files changed

+27
-78
lines changed

pandas/core/arrays/timedeltas.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ def _formatter(self, boxed=False):
445445

446446
return _get_format_timedelta64(self, box=True)
447447

448-
def _format_native_types(self, na_rep="NaT", date_format=None):
448+
def _format_native_types(self, na_rep="NaT", date_format=None, **kwargs):
449449
from pandas.io.formats.format import _get_format_timedelta64
450450

451451
formatter = _get_format_timedelta64(self._data, na_rep)

pandas/core/indexes/datetimes.py

+12-38
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from datetime import datetime, time, timedelta
1+
from datetime import datetime, time, timedelta, tzinfo
22
import operator
3+
from typing import Optional
34
import warnings
45

56
import numpy as np
@@ -66,8 +67,13 @@ class DatetimeDelegateMixin(DatetimelikeDelegateMixin):
6667
# We also have a few "extra" attrs, which may or may not be raw,
6768
# which we we dont' want to expose in the .dt accessor.
6869
_extra_methods = ["to_period", "to_perioddelta", "to_julian_date", "strftime"]
69-
_extra_raw_methods = ["to_pydatetime", "_local_timestamps", "_has_same_tz"]
70-
_extra_raw_properties = ["_box_func", "tz", "tzinfo"]
70+
_extra_raw_methods = [
71+
"to_pydatetime",
72+
"_local_timestamps",
73+
"_has_same_tz",
74+
"_format_native_types",
75+
]
76+
_extra_raw_properties = ["_box_func", "tz", "tzinfo", "dtype"]
7177
_delegated_properties = DatetimeArray._datetimelike_ops + _extra_raw_properties
7278
_delegated_methods = (
7379
DatetimeArray._datetimelike_methods + _extra_methods + _extra_raw_methods
@@ -88,7 +94,7 @@ class DatetimeDelegateMixin(DatetimelikeDelegateMixin):
8894
DatetimeArray,
8995
DatetimeDelegateMixin._delegated_methods,
9096
typ="method",
91-
overwrite=False,
97+
overwrite=True,
9298
)
9399
class DatetimeIndex(DatetimeTimedeltaMixin, DatetimeDelegateMixin):
94100
"""
@@ -197,8 +203,6 @@ class DatetimeIndex(DatetimeTimedeltaMixin, DatetimeDelegateMixin):
197203
_engine_type = libindex.DatetimeEngine
198204
_supports_partial_string_indexing = True
199205

200-
_tz = None
201-
_freq = None
202206
_comparables = ["name", "freqstr", "tz"]
203207
_attributes = ["name", "tz", "freq"]
204208

@@ -214,6 +218,8 @@ class DatetimeIndex(DatetimeTimedeltaMixin, DatetimeDelegateMixin):
214218
_datetimelike_ops = DatetimeArray._datetimelike_ops
215219
_datetimelike_methods = DatetimeArray._datetimelike_methods
216220

221+
tz: Optional[tzinfo]
222+
217223
# --------------------------------------------------------------------
218224
# Constructors
219225

@@ -310,25 +316,6 @@ def __array__(self, dtype=None):
310316
dtype = "M8[ns]"
311317
return np.asarray(self._data, dtype=dtype)
312318

313-
@property
314-
def dtype(self):
315-
return self._data.dtype
316-
317-
@property
318-
def tz(self):
319-
# GH 18595
320-
return self._data.tz
321-
322-
@tz.setter
323-
def tz(self, value):
324-
# GH 3746: Prevent localizing or converting the index by setting tz
325-
raise AttributeError(
326-
"Cannot directly set timezone. Use tz_localize() "
327-
"or tz_convert() as appropriate"
328-
)
329-
330-
tzinfo = tz
331-
332319
@cache_readonly
333320
def _is_dates_only(self) -> bool:
334321
"""
@@ -401,15 +388,6 @@ def _mpl_repr(self):
401388
# how to represent ourselves to matplotlib
402389
return libts.ints_to_pydatetime(self.asi8, self.tz)
403390

404-
def _format_native_types(self, na_rep="NaT", date_format=None, **kwargs):
405-
from pandas.io.formats.format import _get_format_datetime64_from_values
406-
407-
fmt = _get_format_datetime64_from_values(self, date_format)
408-
409-
return libts.format_array_from_datetime(
410-
self.asi8, tz=self.tz, format=fmt, na_rep=na_rep
411-
)
412-
413391
@property
414392
def _formatter_func(self):
415393
from pandas.io.formats.format import _get_format_datetime64
@@ -999,10 +977,6 @@ def __getitem__(self, key):
999977
return result
1000978
return type(self)(result, name=self.name)
1001979

1002-
@property
1003-
def _box_func(self):
1004-
return lambda x: Timestamp(x, tz=self.tz)
1005-
1006980
# --------------------------------------------------------------------
1007981

1008982
@Substitution(klass="DatetimeIndex")

pandas/core/indexes/period.py

+5-14
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,11 @@ class PeriodDelegateMixin(DatetimelikeDelegateMixin):
6666
"""
6767

6868
_delegate_class = PeriodArray
69-
_delegated_properties = PeriodArray._datetimelike_ops
70-
_delegated_methods = set(PeriodArray._datetimelike_methods) | {
71-
"_addsub_int_array",
72-
"strftime",
73-
}
74-
_raw_properties = {"is_leap_year"}
69+
_raw_methods = {"_format_native_types"}
70+
_raw_properties = {"is_leap_year", "freq"}
71+
72+
_delegated_properties = PeriodArray._datetimelike_ops + list(_raw_properties)
73+
_delegated_methods = set(PeriodArray._datetimelike_methods) | _raw_methods
7574

7675

7776
@delegate_names(PeriodArray, PeriodDelegateMixin._delegated_properties, typ="property")
@@ -262,10 +261,6 @@ def _simple_new(cls, values, name=None, freq=None, **kwargs):
262261
def values(self):
263262
return np.asarray(self)
264263

265-
@property
266-
def freq(self) -> DateOffset:
267-
return self._data.freq
268-
269264
def _shallow_copy(self, values=None, **kwargs):
270265
# TODO: simplify, figure out type of values
271266
if values is None:
@@ -363,10 +358,6 @@ def _maybe_convert_timedelta(self, other):
363358
# ------------------------------------------------------------------------
364359
# Rendering Methods
365360

366-
def _format_native_types(self, na_rep="NaT", quoting=None, **kwargs):
367-
# just dispatch, return ndarray
368-
return self._data._format_native_types(na_rep=na_rep, quoting=quoting, **kwargs)
369-
370361
def _mpl_repr(self):
371362
# how to represent ourselves to matplotlib
372363
return self.astype(object).values

pandas/core/indexes/timedeltas.py

+9-25
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,15 @@ class TimedeltaDelegateMixin(DatetimelikeDelegateMixin):
4141
# We also have a few "extra" attrs, which may or may not be raw,
4242
# which we don't want to expose in the .dt accessor.
4343
_delegate_class = TimedeltaArray
44-
_delegated_properties = TimedeltaArray._datetimelike_ops + ["components"]
45-
_delegated_methods = TimedeltaArray._datetimelike_methods + [
46-
"_box_values",
47-
"__neg__",
48-
"__pos__",
49-
"__abs__",
50-
"sum",
51-
"std",
52-
"median",
53-
]
54-
_raw_properties = {"components"}
55-
_raw_methods = {"to_pytimedelta", "sum", "std", "median"}
44+
_raw_properties = {"components", "_box_func"}
45+
_raw_methods = {"to_pytimedelta", "sum", "std", "median", "_format_native_types"}
46+
47+
_delegated_properties = TimedeltaArray._datetimelike_ops + list(_raw_properties)
48+
_delegated_methods = (
49+
TimedeltaArray._datetimelike_methods
50+
+ list(_raw_methods)
51+
+ ["_box_values", "__neg__", "__pos__", "__abs__"]
52+
)
5653

5754

5855
@delegate_names(
@@ -225,22 +222,9 @@ def _formatter_func(self):
225222

226223
return _get_format_timedelta64(self, box=True)
227224

228-
def _format_native_types(self, na_rep="NaT", date_format=None, **kwargs):
229-
from pandas.io.formats.format import Timedelta64Formatter
230-
231-
return np.asarray(
232-
Timedelta64Formatter(
233-
values=self, nat_rep=na_rep, justify="all"
234-
).get_result()
235-
)
236-
237225
# -------------------------------------------------------------------
238226
# Wrapping TimedeltaArray
239227

240-
@property
241-
def _box_func(self):
242-
return lambda x: Timedelta(x, unit="ns")
243-
244228
def __getitem__(self, key):
245229
result = self._data.__getitem__(key)
246230
if is_scalar(result):

0 commit comments

Comments
 (0)