From c0e59e7d750ab7d243e90f9c6717507d0cd3e71b Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 8 Jun 2023 22:53:34 -0400 Subject: [PATCH 01/23] add bug fix for datetimeindex repr --- pandas/core/indexes/datetimes.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 85dd0d6165eec..40602e84b26ee 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -395,10 +395,13 @@ def _is_dates_only(self) -> bool: bool """ from pandas.io.formats.format import is_dates_only + from pandas import Timedelta # error: Argument 1 to "is_dates_only" has incompatible type # "Union[ExtensionArray, ndarray]"; expected "Union[ndarray, # DatetimeArray, Index, DatetimeIndex]" + if self.freq.delta < Timedelta(days=1): + return False return self.tz is None and is_dates_only(self._values) # type: ignore[arg-type] def __reduce__(self): From 642ee78e65e3e077a893f4c150366bd8554268e7 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Sun, 11 Jun 2023 23:18:23 -0400 Subject: [PATCH 02/23] Add tests --- .../tests/indexes/datetimes/test_datetime.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pandas/tests/indexes/datetimes/test_datetime.py b/pandas/tests/indexes/datetimes/test_datetime.py index af1a94391a353..02c21a810e8ae 100644 --- a/pandas/tests/indexes/datetimes/test_datetime.py +++ b/pandas/tests/indexes/datetimes/test_datetime.py @@ -196,3 +196,26 @@ def test_asarray_tz_aware(self): result = np.asarray(idx, dtype=object) tm.assert_numpy_array_equal(result, expected) + + def test__is_dates_only_freq_less_than_day(self): + idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60)+'T') + + res = idx._is_dates_only + + tm.assert_equal(res, False) + + def test__is_dates_only_freq_greater_than_day(self): + idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(2)+'D') + + res = idx._is_dates_only + + tm.assert_equal(res, True) + + + + + + + + + From dcd565e88856ad4f564f88757fc02b6e6ffe0766 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Sun, 11 Jun 2023 23:23:27 -0400 Subject: [PATCH 03/23] Run precommit --- pandas/core/indexes/datetimes.py | 3 ++- pandas/tests/indexes/datetimes/test_datetime.py | 15 +++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 40602e84b26ee..36196e215fbac 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -394,9 +394,10 @@ def _is_dates_only(self) -> bool: ------- bool """ - from pandas.io.formats.format import is_dates_only from pandas import Timedelta + from pandas.io.formats.format import is_dates_only + # error: Argument 1 to "is_dates_only" has incompatible type # "Union[ExtensionArray, ndarray]"; expected "Union[ndarray, # DatetimeArray, Index, DatetimeIndex]" diff --git a/pandas/tests/indexes/datetimes/test_datetime.py b/pandas/tests/indexes/datetimes/test_datetime.py index 02c21a810e8ae..208e3e73082d1 100644 --- a/pandas/tests/indexes/datetimes/test_datetime.py +++ b/pandas/tests/indexes/datetimes/test_datetime.py @@ -196,26 +196,17 @@ def test_asarray_tz_aware(self): result = np.asarray(idx, dtype=object) tm.assert_numpy_array_equal(result, expected) - + def test__is_dates_only_freq_less_than_day(self): - idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60)+'T') + idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60) + "T") res = idx._is_dates_only tm.assert_equal(res, False) def test__is_dates_only_freq_greater_than_day(self): - idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(2)+'D') + idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(2) + "D") res = idx._is_dates_only tm.assert_equal(res, True) - - - - - - - - - From 6a8551ec0d3ae28c5041dd02578cf75eec77f205 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Sun, 11 Jun 2023 23:36:07 -0400 Subject: [PATCH 04/23] Add bug fix to docs --- doc/source/whatsnew/v2.1.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v2.1.0.rst b/doc/source/whatsnew/v2.1.0.rst index 92124a536fe26..840193e9a8cba 100644 --- a/doc/source/whatsnew/v2.1.0.rst +++ b/doc/source/whatsnew/v2.1.0.rst @@ -488,6 +488,7 @@ Other - Bug in :meth:`Series.map` when giving a callable to an empty series, the returned series had ``object`` dtype. It now keeps the original dtype (:issue:`52384`) - Bug in :meth:`Series.memory_usage` when ``deep=True`` throw an error with Series of objects and the returned value is incorrect, as it does not take into account GC corrections (:issue:`51858`) - Fixed incorrect ``__name__`` attribute of ``pandas._libs.json`` (:issue:`52898`) +- Bug in :class:`DatetimeIndex` where ``repr`` of index passed with time does not print time is midnight .. ***DO NOT USE THIS SECTION*** From 39b93e0cc37021b9e75712a96be7f1c48bb4fd71 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 22 Jun 2023 14:42:21 -0400 Subject: [PATCH 05/23] Add check for delta --- pandas/core/indexes/datetimes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 36196e215fbac..bb8d1996fd829 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -401,7 +401,7 @@ def _is_dates_only(self) -> bool: # error: Argument 1 to "is_dates_only" has incompatible type # "Union[ExtensionArray, ndarray]"; expected "Union[ndarray, # DatetimeArray, Index, DatetimeIndex]" - if self.freq.delta < Timedelta(days=1): + if self.freq and self.freq.delta and self.freq.delta < Timedelta(days=1): return False return self.tz is None and is_dates_only(self._values) # type: ignore[arg-type] From 09303b2c7581065f5f4acb9f86421be890618e29 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 22 Jun 2023 16:18:36 -0400 Subject: [PATCH 06/23] Fix check for delta --- pandas/core/indexes/datetimes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 364e9c90c35db..f3eb5cbf79db7 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -401,7 +401,7 @@ def _is_dates_only(self) -> bool: # error: Argument 1 to "is_dates_only" has incompatible type # "Union[ExtensionArray, ndarray]"; expected "Union[ndarray, # DatetimeArray, Index, DatetimeIndex]" - if self.freq and self.freq.delta and self.freq.delta < Timedelta(days=1): + if hasattr(self.freq, 'delta') and self.freq.delta < Timedelta(days=1): return False return self.tz is None and is_dates_only(self._values) # type: ignore[arg-type] From 4d1506a65f302f062a11f76c314fbedef1f89495 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Fri, 23 Jun 2023 12:19:11 -0400 Subject: [PATCH 07/23] Fix precheck --- pandas/core/indexes/datetimes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index f3eb5cbf79db7..8d10730a24465 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -401,7 +401,7 @@ def _is_dates_only(self) -> bool: # error: Argument 1 to "is_dates_only" has incompatible type # "Union[ExtensionArray, ndarray]"; expected "Union[ndarray, # DatetimeArray, Index, DatetimeIndex]" - if hasattr(self.freq, 'delta') and self.freq.delta < Timedelta(days=1): + if hasattr(self.freq, "delta") and self.freq.delta < Timedelta(days=1): return False return self.tz is None and is_dates_only(self._values) # type: ignore[arg-type] From b1c0cf6fc0ec97145a5d97933fa9b33fdad78daa Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Fri, 23 Jun 2023 22:28:51 -0400 Subject: [PATCH 08/23] Fix union-attrs mypy check --- pandas/core/indexes/datetimes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 8d10730a24465..80f0c30f287aa 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -401,7 +401,9 @@ def _is_dates_only(self) -> bool: # error: Argument 1 to "is_dates_only" has incompatible type # "Union[ExtensionArray, ndarray]"; expected "Union[ndarray, # DatetimeArray, Index, DatetimeIndex]" - if hasattr(self.freq, "delta") and self.freq.delta < Timedelta(days=1): + delta = self.freq.delta if self.freq and hasattr(self.freq, "delta") else None + + if delta and delta < Timedelta(days=1): return False return self.tz is None and is_dates_only(self._values) # type: ignore[arg-type] From 43ac7b81895ef95646e7386bd94e2c7ecf3505f8 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 13 Jul 2023 21:22:24 -0400 Subject: [PATCH 09/23] Address Pr comments --- pandas/core/indexes/datetimes.py | 8 +++++--- pandas/tests/indexes/datetimes/test_datetime.py | 16 +--------------- pandas/tests/indexes/datetimes/test_formats.py | 10 ++++++++++ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 80f0c30f287aa..a8bba19de7b3d 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -398,13 +398,15 @@ def _is_dates_only(self) -> bool: from pandas.io.formats.format import is_dates_only + delta = self.freq.delta if self.freq and hasattr(self.freq, "delta") else None + + if delta and delta % Timedelta(days=1) != Timedelta(days=0): + return False + # error: Argument 1 to "is_dates_only" has incompatible type # "Union[ExtensionArray, ndarray]"; expected "Union[ndarray, # DatetimeArray, Index, DatetimeIndex]" - delta = self.freq.delta if self.freq and hasattr(self.freq, "delta") else None - if delta and delta < Timedelta(days=1): - return False return self.tz is None and is_dates_only(self._values) # type: ignore[arg-type] def __reduce__(self): diff --git a/pandas/tests/indexes/datetimes/test_datetime.py b/pandas/tests/indexes/datetimes/test_datetime.py index 208e3e73082d1..78d60324e292e 100644 --- a/pandas/tests/indexes/datetimes/test_datetime.py +++ b/pandas/tests/indexes/datetimes/test_datetime.py @@ -195,18 +195,4 @@ def test_asarray_tz_aware(self): ) result = np.asarray(idx, dtype=object) - tm.assert_numpy_array_equal(result, expected) - - def test__is_dates_only_freq_less_than_day(self): - idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60) + "T") - - res = idx._is_dates_only - - tm.assert_equal(res, False) - - def test__is_dates_only_freq_greater_than_day(self): - idx = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(2) + "D") - - res = idx._is_dates_only - - tm.assert_equal(res, True) + tm.assert_numpy_array_equal(result, expected) \ No newline at end of file diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index a927799e39783..31e48581570ac 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -68,6 +68,16 @@ def test_dti_repr_short(self): dr = pd.date_range(start="1/1/2012", periods=3) repr(dr) + dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60) + "T") + repr(dr) + + dr = DatetimeIndex(["2012-01-01 00:00:00","2012-01-01 01:00:00"], + freq=str(60)+'T') + repr(dr) + + dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(36) + "H") + repr(dr) + @pytest.mark.parametrize("method", ["__repr__", "__str__"]) def test_dti_representation(self, method): idxs = [] From 593e28cf444714df02dade55aa71c14e4914b3c9 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 13 Jul 2023 21:25:33 -0400 Subject: [PATCH 10/23] Reset test_datetime.py --- pandas/tests/indexes/datetimes/test_datetime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/indexes/datetimes/test_datetime.py b/pandas/tests/indexes/datetimes/test_datetime.py index 78d60324e292e..af1a94391a353 100644 --- a/pandas/tests/indexes/datetimes/test_datetime.py +++ b/pandas/tests/indexes/datetimes/test_datetime.py @@ -195,4 +195,4 @@ def test_asarray_tz_aware(self): ) result = np.asarray(idx, dtype=object) - tm.assert_numpy_array_equal(result, expected) \ No newline at end of file + tm.assert_numpy_array_equal(result, expected) From 2b862ea3e8044a2c2bc9d7a4fbdfc0714de1a1e2 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 13 Jul 2023 23:05:45 -0400 Subject: [PATCH 11/23] Fix precommit --- pandas/tests/indexes/datetimes/test_formats.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index 31e48581570ac..3dc4e99816351 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -71,8 +71,9 @@ def test_dti_repr_short(self): dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60) + "T") repr(dr) - dr = DatetimeIndex(["2012-01-01 00:00:00","2012-01-01 01:00:00"], - freq=str(60)+'T') + dr = DatetimeIndex( + ["2012-01-01 00:00:00","2012-01-01 01:00:00"], freq=str(60)+'T' + ) repr(dr) dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(36) + "H") From c22f7e7194cc7cb4613037f3dc0252689a439fd5 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 13 Jul 2023 23:29:14 -0400 Subject: [PATCH 12/23] Fix precommit quotes --- pandas/tests/indexes/datetimes/test_formats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index 3dc4e99816351..a227bcc557c50 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -72,7 +72,7 @@ def test_dti_repr_short(self): repr(dr) dr = DatetimeIndex( - ["2012-01-01 00:00:00","2012-01-01 01:00:00"], freq=str(60)+'T' + ["2012-01-01 00:00:00","2012-01-01 01:00:00"], freq=str(60) + "T" ) repr(dr) From d12977a48299a49621641e55f14663cb82bb45fa Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Thu, 13 Jul 2023 23:35:59 -0400 Subject: [PATCH 13/23] Fix formatting --- pandas/tests/indexes/datetimes/test_formats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index a227bcc557c50..ab059e532b1e5 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -72,7 +72,7 @@ def test_dti_repr_short(self): repr(dr) dr = DatetimeIndex( - ["2012-01-01 00:00:00","2012-01-01 01:00:00"], freq=str(60) + "T" + ["2012-01-01 00:00:00", "2012-01-01 01:00:00"], freq=str(60) + "T" ) repr(dr) From e6ef416dd1f36084080269f6cb4ff8ab7c84c98c Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Mon, 17 Jul 2023 14:12:01 -0400 Subject: [PATCH 14/23] Fix whatsnew doc --- doc/source/whatsnew/v2.1.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v2.1.0.rst b/doc/source/whatsnew/v2.1.0.rst index b9a14523df601..fe99be0b106d7 100644 --- a/doc/source/whatsnew/v2.1.0.rst +++ b/doc/source/whatsnew/v2.1.0.rst @@ -618,7 +618,7 @@ Other - Bug in :meth:`Series.memory_usage` when ``deep=True`` throw an error with Series of objects and the returned value is incorrect, as it does not take into account GC corrections (:issue:`51858`) - Bug in :meth:`period_range` the default behavior when freq was not passed as an argument was incorrect(:issue:`53687`) - Fixed incorrect ``__name__`` attribute of ``pandas._libs.json`` (:issue:`52898`) -- Bug in :class:`DatetimeIndex` where ``repr`` of index passed with time does not print time is midnight +- Bug in :class:`DatetimeIndex` where ``repr`` of index passed with time does not print time is midnight and non-day based freq(:issue:`53470`) .. ***DO NOT USE THIS SECTION*** From 0896cc9e5d89a7d086d20b3c4e950e31c76c2dd3 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Mon, 17 Jul 2023 14:25:39 -0400 Subject: [PATCH 15/23] Update tests to assert --- pandas/tests/indexes/datetimes/test_formats.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index ab059e532b1e5..e3443f1ea6eeb 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -68,16 +68,22 @@ def test_dti_repr_short(self): dr = pd.date_range(start="1/1/2012", periods=3) repr(dr) + expected = "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='60T')" dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60) + "T") - repr(dr) + result = repr(dr) + assert expected == result + expected = "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00'], dtype='datetime64[ns]', freq='60T')" dr = DatetimeIndex( ["2012-01-01 00:00:00", "2012-01-01 01:00:00"], freq=str(60) + "T" ) - repr(dr) + result = repr(dr) + assert expected == result + expected = "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='36H')" dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(36) + "H") - repr(dr) + result = repr(dr) + assert expected == result @pytest.mark.parametrize("method", ["__repr__", "__str__"]) def test_dti_representation(self, method): From 95a4a5a2c983eed60d5ca864c9317c1566f0da72 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Mon, 17 Jul 2023 14:36:38 -0400 Subject: [PATCH 16/23] run precommit --- doc/source/whatsnew/v2.1.0.rst | 2 +- pandas/tests/indexes/datetimes/test_formats.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/source/whatsnew/v2.1.0.rst b/doc/source/whatsnew/v2.1.0.rst index fe99be0b106d7..e0b18a3967d4d 100644 --- a/doc/source/whatsnew/v2.1.0.rst +++ b/doc/source/whatsnew/v2.1.0.rst @@ -606,6 +606,7 @@ Metadata Other ^^^^^ - Bug in :class:`DataFrame` and :class:`Series` raising for data of complex dtype when ``NaN`` values are present (:issue:`53627`) +- Bug in :class:`DatetimeIndex` where ``repr`` of index passed with time does not print time is midnight and non-day based freq(:issue:`53470`) - Bug in :class:`FloatingArray.__contains__` with ``NaN`` item incorrectly returning ``False`` when ``NaN`` values are present (:issue:`52840`) - Bug in :func:`api.interchange.from_dataframe` when converting an empty DataFrame object (:issue:`53155`) - Bug in :func:`assert_almost_equal` now throwing assertion error for two unequal sets (:issue:`51727`) @@ -618,7 +619,6 @@ Other - Bug in :meth:`Series.memory_usage` when ``deep=True`` throw an error with Series of objects and the returned value is incorrect, as it does not take into account GC corrections (:issue:`51858`) - Bug in :meth:`period_range` the default behavior when freq was not passed as an argument was incorrect(:issue:`53687`) - Fixed incorrect ``__name__`` attribute of ``pandas._libs.json`` (:issue:`52898`) -- Bug in :class:`DatetimeIndex` where ``repr`` of index passed with time does not print time is midnight and non-day based freq(:issue:`53470`) .. ***DO NOT USE THIS SECTION*** diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index e3443f1ea6eeb..e4ab6768bbf05 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -68,7 +68,9 @@ def test_dti_repr_short(self): dr = pd.date_range(start="1/1/2012", periods=3) repr(dr) - expected = "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='60T')" + expected = ( + "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='60T')" + ) dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60) + "T") result = repr(dr) assert expected == result @@ -80,7 +82,9 @@ def test_dti_repr_short(self): result = repr(dr) assert expected == result - expected = "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='36H')" + expected = ( + "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='36H')" + ) dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(36) + "H") result = repr(dr) assert expected == result From 7cc38c2eaa1659758bc602ba5f71eeba0f646c43 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Mon, 17 Jul 2023 14:50:53 -0400 Subject: [PATCH 17/23] break up long line --- pandas/tests/indexes/datetimes/test_formats.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index e4ab6768bbf05..26953861baaad 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -75,7 +75,10 @@ def test_dti_repr_short(self): result = repr(dr) assert expected == result - expected = "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00'], dtype='datetime64[ns]', freq='60T')" + expected = ( + "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00']," + " dtype='datetime64[ns]', freq='60T')" + ) dr = DatetimeIndex( ["2012-01-01 00:00:00", "2012-01-01 01:00:00"], freq=str(60) + "T" ) From 56c5b16c5ddab1643dc63998872ebc3185a47b69 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Mon, 17 Jul 2023 15:06:58 -0400 Subject: [PATCH 18/23] Fix space placement --- pandas/tests/indexes/datetimes/test_formats.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index 26953861baaad..fe493168f4e4f 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -76,8 +76,8 @@ def test_dti_repr_short(self): assert expected == result expected = ( - "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00']," - " dtype='datetime64[ns]', freq='60T')" + "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00'], " + "dtype='datetime64[ns]', freq='60T')" ) dr = DatetimeIndex( ["2012-01-01 00:00:00", "2012-01-01 01:00:00"], freq=str(60) + "T" From 3f7adc60ddda1bea6d949f521595a960dae71aec Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Tue, 18 Jul 2023 14:51:26 -0400 Subject: [PATCH 19/23] Add github issue number --- pandas/tests/indexes/datetimes/test_formats.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index fe493168f4e4f..9b844279b794f 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -68,6 +68,7 @@ def test_dti_repr_short(self): dr = pd.date_range(start="1/1/2012", periods=3) repr(dr) + # GH53634 expected = ( "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='60T')" ) @@ -86,9 +87,9 @@ def test_dti_repr_short(self): assert expected == result expected = ( - "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='36H')" + "DatetimeIndex(['2012-01-01'], dtype='datetime64[ns]', freq='24H')" ) - dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(36) + "H") + dr = DatetimeIndex(["2012-01-01"], freq=str(24) + "H") result = repr(dr) assert expected == result From 423036f6720f154c321d467a0c9505131d8bd7b6 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Tue, 18 Jul 2023 14:54:23 -0400 Subject: [PATCH 20/23] use datetime timedelta --- pandas/core/indexes/datetimes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index dd42bceaa473e..7047cb4d251e5 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -393,13 +393,13 @@ def _is_dates_only(self) -> bool: ------- bool """ - from pandas import Timedelta + from datetime import timedelta from pandas.io.formats.format import is_dates_only delta = self.freq.delta if self.freq and hasattr(self.freq, "delta") else None - if delta and delta % Timedelta(days=1) != Timedelta(days=0): + if delta and delta % timedelta(days=1) != timedelta(days=0): return False # error: Argument 1 to "is_dates_only" has incompatible type From f89920bdff902d5f4036e6fc94fb185d2c9d4817 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Tue, 18 Jul 2023 15:13:03 -0400 Subject: [PATCH 21/23] run precommit --- pandas/tests/indexes/datetimes/test_formats.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index 9b844279b794f..ee8ad2bbdf6f1 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -86,9 +86,7 @@ def test_dti_repr_short(self): result = repr(dr) assert expected == result - expected = ( - "DatetimeIndex(['2012-01-01'], dtype='datetime64[ns]', freq='24H')" - ) + expected = "DatetimeIndex(['2012-01-01'], dtype='datetime64[ns]', freq='24H')" dr = DatetimeIndex(["2012-01-01"], freq=str(24) + "H") result = repr(dr) assert expected == result From 64ddebd05e262e9d228558ce04a3193e86300f25 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Sat, 22 Jul 2023 12:00:26 -0400 Subject: [PATCH 22/23] Fix formatting --- pandas/core/indexes/datetimes.py | 3 +- .../tests/indexes/datetimes/test_formats.py | 49 +++++++++++-------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 7047cb4d251e5..7a0bbf0a28456 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -393,13 +393,12 @@ def _is_dates_only(self) -> bool: ------- bool """ - from datetime import timedelta from pandas.io.formats.format import is_dates_only delta = self.freq.delta if self.freq and hasattr(self.freq, "delta") else None - if delta and delta % timedelta(days=1) != timedelta(days=0): + if delta and delta % dt.timedelta(days=1) != dt.timedelta(days=0): return False # error: Argument 1 to "is_dates_only" has incompatible type diff --git a/pandas/tests/indexes/datetimes/test_formats.py b/pandas/tests/indexes/datetimes/test_formats.py index ee8ad2bbdf6f1..cb3e0179bf46c 100644 --- a/pandas/tests/indexes/datetimes/test_formats.py +++ b/pandas/tests/indexes/datetimes/test_formats.py @@ -68,28 +68,35 @@ def test_dti_repr_short(self): dr = pd.date_range(start="1/1/2012", periods=3) repr(dr) + @pytest.mark.parametrize( + "dates, freq, expected_repr", + [ + ( + ["2012-01-01 00:00:00"], + "60T", + ( + "DatetimeIndex(['2012-01-01 00:00:00'], " + "dtype='datetime64[ns]', freq='60T')" + ), + ), + ( + ["2012-01-01 00:00:00", "2012-01-01 01:00:00"], + "60T", + "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00'], " + "dtype='datetime64[ns]', freq='60T')", + ), + ( + ["2012-01-01"], + "24H", + "DatetimeIndex(['2012-01-01'], dtype='datetime64[ns]', freq='24H')", + ), + ], + ) + def test_dti_repr_time_midnight(self, dates, freq, expected_repr): # GH53634 - expected = ( - "DatetimeIndex(['2012-01-01 00:00:00'], dtype='datetime64[ns]', freq='60T')" - ) - dr = DatetimeIndex(["2012-01-01 00:00:00"], freq=str(60) + "T") - result = repr(dr) - assert expected == result - - expected = ( - "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00'], " - "dtype='datetime64[ns]', freq='60T')" - ) - dr = DatetimeIndex( - ["2012-01-01 00:00:00", "2012-01-01 01:00:00"], freq=str(60) + "T" - ) - result = repr(dr) - assert expected == result - - expected = "DatetimeIndex(['2012-01-01'], dtype='datetime64[ns]', freq='24H')" - dr = DatetimeIndex(["2012-01-01"], freq=str(24) + "H") - result = repr(dr) - assert expected == result + dti = DatetimeIndex(dates, freq) + actual_repr = repr(dti) + assert actual_repr == expected_repr @pytest.mark.parametrize("method", ["__repr__", "__str__"]) def test_dti_representation(self, method): From a9d1698ab4702ec4731b48066068c7456efb2724 Mon Sep 17 00:00:00 2001 From: Simar Bassi <44808125+Simar-B@users.noreply.github.com> Date: Sat, 22 Jul 2023 14:30:00 -0400 Subject: [PATCH 23/23] Use getattr Co-authored-by: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com> --- pandas/core/indexes/datetimes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 7a0bbf0a28456..10779bbcde0a2 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -396,7 +396,7 @@ def _is_dates_only(self) -> bool: from pandas.io.formats.format import is_dates_only - delta = self.freq.delta if self.freq and hasattr(self.freq, "delta") else None + delta = getattr(self.freq, "delta", None) if delta and delta % dt.timedelta(days=1) != dt.timedelta(days=0): return False