From a6bd0d49cea33b668b3189780aeec78b1e6825d9 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Thu, 2 Apr 2020 19:06:02 -0700 Subject: [PATCH 1/4] Display Timedelta nanoseconds --- pandas/_libs/tslibs/timedeltas.pyx | 4 +++- pandas/tests/frame/methods/test_describe.py | 18 +++++++++--------- .../scalar/timedelta/test_constructors.py | 5 ++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pandas/_libs/tslibs/timedeltas.pyx b/pandas/_libs/tslibs/timedeltas.pyx index c8bf317cbf041..f2b77f3517a25 100644 --- a/pandas/_libs/tslibs/timedeltas.pyx +++ b/pandas/_libs/tslibs/timedeltas.pyx @@ -1072,9 +1072,11 @@ cdef class _Timedelta(timedelta): subs = (self._h or self._m or self._s or self._ms or self._us or self._ns) - # by default not showing nano if self._ms or self._us or self._ns: seconds_fmt = "{seconds:02}.{milliseconds:03}{microseconds:03}" + if self._ns: + # GH#9309 + seconds_fmt += "{nanoseconds:03}" else: seconds_fmt = "{seconds:02}" diff --git a/pandas/tests/frame/methods/test_describe.py b/pandas/tests/frame/methods/test_describe.py index 8a75e80a12f52..b61d0d28e2fba 100644 --- a/pandas/tests/frame/methods/test_describe.py +++ b/pandas/tests/frame/methods/test_describe.py @@ -230,15 +230,15 @@ def test_describe_timedelta_values(self): tm.assert_frame_equal(result, expected) exp_repr = ( - " t1 t2\n" - "count 5 5\n" - "mean 3 days 00:00:00 0 days 03:00:00\n" - "std 1 days 13:56:50.394919 0 days 01:34:52.099788\n" - "min 1 days 00:00:00 0 days 01:00:00\n" - "25% 2 days 00:00:00 0 days 02:00:00\n" - "50% 3 days 00:00:00 0 days 03:00:00\n" - "75% 4 days 00:00:00 0 days 04:00:00\n" - "max 5 days 00:00:00 0 days 05:00:00" + " t1 t2\n" + "count 5 5\n" + "mean 3 days 00:00:00 0 days 03:00:00\n" + "std 1 days 13:56:50.394919273 0 days 01:34:52.099788303\n" + "min 1 days 00:00:00 0 days 01:00:00\n" + "25% 2 days 00:00:00 0 days 02:00:00\n" + "50% 3 days 00:00:00 0 days 03:00:00\n" + "75% 4 days 00:00:00 0 days 04:00:00\n" + "max 5 days 00:00:00 0 days 05:00:00" ) assert repr(result) == exp_repr diff --git a/pandas/tests/scalar/timedelta/test_constructors.py b/pandas/tests/scalar/timedelta/test_constructors.py index ec3c6e9e3a326..c58994d738562 100644 --- a/pandas/tests/scalar/timedelta/test_constructors.py +++ b/pandas/tests/scalar/timedelta/test_constructors.py @@ -176,10 +176,9 @@ def test_td_from_repr_roundtrip(val): td = Timedelta(val) assert Timedelta(td.value) == td - # str does not normally display nanos - if not td.nanoseconds: - assert Timedelta(str(td)) == td + assert Timedelta(str(td)) == td assert Timedelta(td._repr_base(format="all")) == td + assert Timedelta(td._repr_base()) == td def test_overflow_on_construction(): From 2b327c933f1a25985b08f302ea9c1a053faa0e70 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Thu, 2 Apr 2020 19:56:11 -0700 Subject: [PATCH 2/4] update doctest --- pandas/core/tools/timedeltas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/tools/timedeltas.py b/pandas/core/tools/timedeltas.py index d7529ec799022..913617ca31e0d 100644 --- a/pandas/core/tools/timedeltas.py +++ b/pandas/core/tools/timedeltas.py @@ -58,7 +58,7 @@ def to_timedelta(arg, unit="ns", errors="raise"): >>> pd.to_timedelta('1 days 06:05:01.00003') Timedelta('1 days 06:05:01.000030') >>> pd.to_timedelta('15.5us') - Timedelta('0 days 00:00:00.000015') + Timedelta('0 days 00:00:00.000015500') Parsing a list or array of strings: From 478cece829b09ef312cf9c2dbb3e69a0df8c0b26 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Fri, 3 Apr 2020 09:48:51 -0700 Subject: [PATCH 3/4] fix doctest --- pandas/core/tools/timedeltas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/tools/timedeltas.py b/pandas/core/tools/timedeltas.py index 913617ca31e0d..960a82caafeeb 100644 --- a/pandas/core/tools/timedeltas.py +++ b/pandas/core/tools/timedeltas.py @@ -63,7 +63,7 @@ def to_timedelta(arg, unit="ns", errors="raise"): Parsing a list or array of strings: >>> pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan']) - TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015', NaT], + TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None) Converting numbers by specifying the `unit` keyword argument: From eb2d54595475fcf9d31b83be6b02fcd83c04b03d Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Fri, 3 Apr 2020 10:37:40 -0700 Subject: [PATCH 4/4] whatsnew --- doc/source/whatsnew/v1.1.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index 7fe8f78151336..0969360d66fcc 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -310,6 +310,7 @@ Timedelta - Bug in constructing a :class:`Timedelta` with a high precision integer that would round the :class:`Timedelta` components (:issue:`31354`) - Bug in dividing ``np.nan`` or ``None`` by :class:`Timedelta`` incorrectly returning ``NaT`` (:issue:`31869`) - Timedeltas now understand ``µs`` as identifier for microsecond (:issue:`32899`) +- :class:`Timedelta` string representation now includes nanoseconds, when nanoseconds are non-zero (:issue:`9309`) Timezones ^^^^^^^^^