Skip to content

Commit 8dd3d87

Browse files
authored
REF: dispatch TDBlock.to_native_types to TDA._format_native_types (#33270)
1 parent 586f63b commit 8dd3d87

File tree

9 files changed

+26
-49
lines changed

9 files changed

+26
-49
lines changed

pandas/core/arrays/timedeltas.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ def _format_native_types(self, na_rep="NaT", date_format=None, **kwargs):
389389
from pandas.io.formats.format import _get_format_timedelta64
390390

391391
formatter = _get_format_timedelta64(self._data, na_rep)
392-
return np.array([formatter(x) for x in self._data])
392+
return np.array([formatter(x) for x in self._data.ravel()]).reshape(self.shape)
393393

394394
# ----------------------------------------------------------------
395395
# Arithmetic Methods

pandas/core/construction.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def array(
187187
188188
>>> pd.array(["1H", "2H"], dtype='timedelta64[ns]')
189189
<TimedeltaArray>
190-
['01:00:00', '02:00:00']
190+
['0 days 01:00:00', '0 days 02:00:00']
191191
Length: 2, dtype: timedelta64[ns]
192192
193193
Examples

pandas/core/indexes/accessors.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,9 @@ class TimedeltaProperties(Properties):
241241
... pd.timedelta_range(start="1 second", periods=3, freq="S")
242242
... )
243243
>>> seconds_series
244-
0 00:00:01
245-
1 00:00:02
246-
2 00:00:03
244+
0 0 days 00:00:01
245+
1 0 days 00:00:02
246+
2 0 days 00:00:03
247247
dtype: timedelta64[ns]
248248
>>> seconds_series.dt.seconds
249249
0 1
@@ -301,11 +301,11 @@ def components(self):
301301
--------
302302
>>> s = pd.Series(pd.to_timedelta(np.arange(5), unit='s'))
303303
>>> s
304-
0 00:00:00
305-
1 00:00:01
306-
2 00:00:02
307-
3 00:00:03
308-
4 00:00:04
304+
0 0 days 00:00:00
305+
1 0 days 00:00:01
306+
2 0 days 00:00:02
307+
3 0 days 00:00:03
308+
4 0 days 00:00:04
309309
dtype: timedelta64[ns]
310310
>>> s.dt.components
311311
days hours minutes seconds milliseconds microseconds nanoseconds

pandas/core/internals/blocks.py

+3-19
Original file line numberDiff line numberDiff line change
@@ -2357,26 +2357,10 @@ def fillna(self, value, **kwargs):
23572357
)
23582358
return super().fillna(value, **kwargs)
23592359

2360-
def to_native_types(self, na_rep=None, quoting=None, **kwargs):
2360+
def to_native_types(self, na_rep="NaT", **kwargs):
23612361
""" convert to our native types format """
2362-
values = self.values
2363-
mask = isna(values)
2364-
2365-
rvalues = np.empty(values.shape, dtype=object)
2366-
if na_rep is None:
2367-
na_rep = "NaT"
2368-
rvalues[mask] = na_rep
2369-
imask = (~mask).ravel()
2370-
2371-
# FIXME:
2372-
# should use the formats.format.Timedelta64Formatter here
2373-
# to figure what format to pass to the Timedelta
2374-
# e.g. to not show the decimals say
2375-
rvalues.flat[imask] = np.array(
2376-
[Timedelta(val)._repr_base(format="all") for val in values.ravel()[imask]],
2377-
dtype=object,
2378-
)
2379-
return rvalues
2362+
tda = self.array_values()
2363+
return tda._format_native_types(na_rep, **kwargs)
23802364

23812365

23822366
class BoolBlock(NumericBlock):

pandas/core/tools/timedeltas.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ def to_timedelta(arg, unit="ns", errors="raise"):
6969
Converting numbers by specifying the `unit` keyword argument:
7070
7171
>>> pd.to_timedelta(np.arange(5), unit='s')
72-
TimedeltaIndex(['00:00:00', '00:00:01', '00:00:02',
73-
'00:00:03', '00:00:04'],
72+
TimedeltaIndex(['0 days 00:00:00', '0 days 00:00:01', '0 days 00:00:02',
73+
'0 days 00:00:03', '0 days 00:00:04'],
7474
dtype='timedelta64[ns]', freq=None)
7575
>>> pd.to_timedelta(np.arange(5), unit='d')
7676
TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'],

pandas/io/formats/format.py

-5
Original file line numberDiff line numberDiff line change
@@ -1672,14 +1672,9 @@ def _get_format_timedelta64(
16721672
even_days = (
16731673
np.logical_and(consider_values, values_int % one_day_nanos != 0).sum() == 0
16741674
)
1675-
all_sub_day = (
1676-
np.logical_and(consider_values, np.abs(values_int) >= one_day_nanos).sum() == 0
1677-
)
16781675

16791676
if even_days:
16801677
format = None
1681-
elif all_sub_day:
1682-
format = "sub_day"
16831678
else:
16841679
format = "long"
16851680

pandas/tests/frame/test_dtypes.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,7 @@ def test_astype_str(self):
248248
{
249249
"a": list(map(str, map(lambda x: Timestamp(x)._date_repr, a._values))),
250250
"b": list(map(str, map(Timestamp, b._values))),
251-
"c": list(
252-
map(
253-
str,
254-
map(lambda x: Timedelta(x)._repr_base(format="all"), c._values),
255-
)
256-
),
251+
"c": list(map(lambda x: Timedelta(x)._repr_base(), c._values)),
257252
"d": list(map(str, d._values)),
258253
"e": list(map(str, e._values)),
259254
}

pandas/tests/io/formats/test_format.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -3003,13 +3003,13 @@ def test_days_neg(self):
30033003
def test_subdays(self):
30043004
y = pd.to_timedelta(list(range(5)) + [pd.NaT], unit="s")
30053005
result = fmt.Timedelta64Formatter(y, box=True).get_result()
3006-
assert result[0].strip() == "'00:00:00'"
3007-
assert result[1].strip() == "'00:00:01'"
3006+
assert result[0].strip() == "'0 days 00:00:00'"
3007+
assert result[1].strip() == "'0 days 00:00:01'"
30083008

30093009
def test_subdays_neg(self):
30103010
y = pd.to_timedelta(list(range(5)) + [pd.NaT], unit="s")
30113011
result = fmt.Timedelta64Formatter(-y, box=True).get_result()
3012-
assert result[0].strip() == "'00:00:00'"
3012+
assert result[0].strip() == "'0 days 00:00:00'"
30133013
assert result[1].strip() == "'-1 days +23:59:59'"
30143014

30153015
def test_zero(self):

pandas/tests/series/test_dtypes.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def test_astype_str_map(self, dtype, series):
132132
expected = series.map(str)
133133
tm.assert_series_equal(result, expected)
134134

135-
def test_astype_str_cast(self):
135+
def test_astype_str_cast_dt64(self):
136136
# see gh-9757
137137
ts = Series([Timestamp("2010-01-04 00:00:00")])
138138
s = ts.astype(str)
@@ -146,11 +146,14 @@ def test_astype_str_cast(self):
146146
expected = Series([str("2010-01-04 00:00:00-05:00")])
147147
tm.assert_series_equal(s, expected)
148148

149+
def test_astype_str_cast_td64(self):
150+
# see gh-9757
151+
149152
td = Series([Timedelta(1, unit="d")])
150-
s = td.astype(str)
153+
ser = td.astype(str)
151154

152-
expected = Series([str("1 days 00:00:00.000000000")])
153-
tm.assert_series_equal(s, expected)
155+
expected = Series([str("1 days")])
156+
tm.assert_series_equal(ser, expected)
154157

155158
def test_astype_unicode(self):
156159
# see gh-7758: A bit of magic is required to set

0 commit comments

Comments
 (0)