Skip to content

Commit 7b032ec

Browse files
authored
Display Timedelta nanoseconds (#33250)
1 parent 1bb5417 commit 7b032ec

File tree

5 files changed

+17
-15
lines changed

5 files changed

+17
-15
lines changed

doc/source/whatsnew/v1.1.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ Timedelta
310310
- Bug in constructing a :class:`Timedelta` with a high precision integer that would round the :class:`Timedelta` components (:issue:`31354`)
311311
- Bug in dividing ``np.nan`` or ``None`` by :class:`Timedelta`` incorrectly returning ``NaT`` (:issue:`31869`)
312312
- Timedeltas now understand ``µs`` as identifier for microsecond (:issue:`32899`)
313+
- :class:`Timedelta` string representation now includes nanoseconds, when nanoseconds are non-zero (:issue:`9309`)
313314

314315
Timezones
315316
^^^^^^^^^

pandas/_libs/tslibs/timedeltas.pyx

+3-1
Original file line numberDiff line numberDiff line change
@@ -1072,9 +1072,11 @@ cdef class _Timedelta(timedelta):
10721072
subs = (self._h or self._m or self._s or
10731073
self._ms or self._us or self._ns)
10741074

1075-
# by default not showing nano
10761075
if self._ms or self._us or self._ns:
10771076
seconds_fmt = "{seconds:02}.{milliseconds:03}{microseconds:03}"
1077+
if self._ns:
1078+
# GH#9309
1079+
seconds_fmt += "{nanoseconds:03}"
10781080
else:
10791081
seconds_fmt = "{seconds:02}"
10801082

pandas/core/tools/timedeltas.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ def to_timedelta(arg, unit="ns", errors="raise"):
5858
>>> pd.to_timedelta('1 days 06:05:01.00003')
5959
Timedelta('1 days 06:05:01.000030')
6060
>>> pd.to_timedelta('15.5us')
61-
Timedelta('0 days 00:00:00.000015')
61+
Timedelta('0 days 00:00:00.000015500')
6262
6363
Parsing a list or array of strings:
6464
6565
>>> pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan'])
66-
TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015', NaT],
66+
TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT],
6767
dtype='timedelta64[ns]', freq=None)
6868
6969
Converting numbers by specifying the `unit` keyword argument:

pandas/tests/frame/methods/test_describe.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -230,15 +230,15 @@ def test_describe_timedelta_values(self):
230230
tm.assert_frame_equal(result, expected)
231231

232232
exp_repr = (
233-
" t1 t2\n"
234-
"count 5 5\n"
235-
"mean 3 days 00:00:00 0 days 03:00:00\n"
236-
"std 1 days 13:56:50.394919 0 days 01:34:52.099788\n"
237-
"min 1 days 00:00:00 0 days 01:00:00\n"
238-
"25% 2 days 00:00:00 0 days 02:00:00\n"
239-
"50% 3 days 00:00:00 0 days 03:00:00\n"
240-
"75% 4 days 00:00:00 0 days 04:00:00\n"
241-
"max 5 days 00:00:00 0 days 05:00:00"
233+
" t1 t2\n"
234+
"count 5 5\n"
235+
"mean 3 days 00:00:00 0 days 03:00:00\n"
236+
"std 1 days 13:56:50.394919273 0 days 01:34:52.099788303\n"
237+
"min 1 days 00:00:00 0 days 01:00:00\n"
238+
"25% 2 days 00:00:00 0 days 02:00:00\n"
239+
"50% 3 days 00:00:00 0 days 03:00:00\n"
240+
"75% 4 days 00:00:00 0 days 04:00:00\n"
241+
"max 5 days 00:00:00 0 days 05:00:00"
242242
)
243243
assert repr(result) == exp_repr
244244

pandas/tests/scalar/timedelta/test_constructors.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,9 @@ def test_td_from_repr_roundtrip(val):
176176
td = Timedelta(val)
177177
assert Timedelta(td.value) == td
178178

179-
# str does not normally display nanos
180-
if not td.nanoseconds:
181-
assert Timedelta(str(td)) == td
179+
assert Timedelta(str(td)) == td
182180
assert Timedelta(td._repr_base(format="all")) == td
181+
assert Timedelta(td._repr_base()) == td
183182

184183

185184
def test_overflow_on_construction():

0 commit comments

Comments
 (0)