From 642392040a53f30fc1882d6f13643e4603380ce1 Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Mon, 18 Oct 2021 18:25:15 +0530 Subject: [PATCH 01/12] Follows 1.2.5 behaviour --- pandas/core/indexes/multi.py | 6 ++++++ pandas/tests/series/methods/test_reset_index.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index e2f1a2d6a1e23..a315d02b298ca 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1673,6 +1673,12 @@ def get_level_values(self, level): """ level = self._get_level_number(level) values = self._get_level_values(level) + import pandas as pd + try: + values = pd.to_datetime(values) + except: + pass + return values @doc(Index.unique) diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index b159317bf813b..afb37a0b186b3 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -179,3 +179,17 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): {"level_0": np.int64, "level_1": np.float64, "level_2": dtype, 0: object} ) tm.assert_series_equal(result, expected) + +def test_set_index_MultiIndex(): + import datetime as dt + df = DataFrame({'date': [dt.date(2021, 8, 1), + dt.date(2021, 8, 2), + dt.date(2021, 8, 3)], + 'ticker': ['aapl', 'goog', 'yhoo'], + 'value': [5.63269, 4.45609, 2.74843]}) + + df.set_index(['date', 'ticker'], inplace=True) + res = df.index.get_level_values(0) + ex = pd.DatetimeIndex(['2021-08-01', '2021-08-02', '2021-08-03'], dtype='datetime64[ns]', name='date', freq=None) + for i in range(len(ex)): + assert ex[i] == res[i] From e04cf72b942b61de6702169ce5cd861ceb168049 Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Mon, 18 Oct 2021 18:37:01 +0530 Subject: [PATCH 02/12] PEP 8 Issues --- pandas/core/indexes/multi.py | 2 +- .../tests/series/methods/test_reset_index.py | 28 ++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index a315d02b298ca..76baf169f7e15 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1676,7 +1676,7 @@ def get_level_values(self, level): import pandas as pd try: values = pd.to_datetime(values) - except: + except ValueError: pass return values diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index afb37a0b186b3..7c40b6fd8e349 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -180,16 +180,30 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): ) tm.assert_series_equal(result, expected) + def test_set_index_MultiIndex(): import datetime as dt - df = DataFrame({'date': [dt.date(2021, 8, 1), - dt.date(2021, 8, 2), - dt.date(2021, 8, 3)], - 'ticker': ['aapl', 'goog', 'yhoo'], - 'value': [5.63269, 4.45609, 2.74843]}) + df = DataFrame( + {'date': + [dt.date(2021, 8, 1), + dt.date(2021, 8, 2), + dt.date(2021, 8, 3)], + 'ticker': + ['aapl', 'goog', 'yhoo'], + 'value': + [5.63269, 4.45609, 2.74843]} + ) - df.set_index(['date', 'ticker'], inplace=True) + df.set_index( + ['date', 'ticker'], + inplace=True + ) res = df.index.get_level_values(0) - ex = pd.DatetimeIndex(['2021-08-01', '2021-08-02', '2021-08-03'], dtype='datetime64[ns]', name='date', freq=None) + ex = pd.DatetimeIndex( + ['2021-08-01', '2021-08-02', '2021-08-03'], + dtype='datetime64[ns]', + name='date', + freq=None + ) for i in range(len(ex)): assert ex[i] == res[i] From 92c6be6cbda367d99a47cc075cb2bf2b44f2e33a Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Mon, 18 Oct 2021 18:39:51 +0530 Subject: [PATCH 03/12] Update test_reset_index.py --- pandas/tests/series/methods/test_reset_index.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index 7c40b6fd8e349..4744c600fd0d2 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -184,19 +184,13 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): def test_set_index_MultiIndex(): import datetime as dt df = DataFrame( - {'date': - [dt.date(2021, 8, 1), - dt.date(2021, 8, 2), - dt.date(2021, 8, 3)], - 'ticker': - ['aapl', 'goog', 'yhoo'], - 'value': - [5.63269, 4.45609, 2.74843]} + {'date': [dt.date(2021, 8, 1), dt.date(2021, 8, 2), dt.date(2021, 8, 3)], + 'ticker':['aapl', 'goog', 'yhoo'], + 'value': [5.63269, 4.45609, 2.74843]} ) df.set_index( - ['date', 'ticker'], - inplace=True + ['date', 'ticker'], inplace=True ) res = df.index.get_level_values(0) ex = pd.DatetimeIndex( From 715b580824fa8d3b92bf72d480df8375e2edd8ed Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Mon, 18 Oct 2021 18:41:50 +0530 Subject: [PATCH 04/12] Update test_reset_index.py --- pandas/tests/series/methods/test_reset_index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index 4744c600fd0d2..1476177ddec0d 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -184,8 +184,8 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): def test_set_index_MultiIndex(): import datetime as dt df = DataFrame( - {'date': [dt.date(2021, 8, 1), dt.date(2021, 8, 2), dt.date(2021, 8, 3)], - 'ticker':['aapl', 'goog', 'yhoo'], + {'date': [dt.date(2021, 8, 1), dt.date(2021, 8, 2),\ + dt.date(2021, 8, 3)], 'ticker':['aapl', 'goog', 'yhoo'],\ 'value': [5.63269, 4.45609, 2.74843]} ) From 44075c1f7c56b63272fa4de56e0293505cb626fa Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Mon, 18 Oct 2021 20:00:44 +0530 Subject: [PATCH 05/12] PEP8 issues --- pandas/tests/series/methods/test_reset_index.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index 1476177ddec0d..a0097b008b287 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -184,9 +184,11 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): def test_set_index_MultiIndex(): import datetime as dt df = DataFrame( - {'date': [dt.date(2021, 8, 1), dt.date(2021, 8, 2),\ - dt.date(2021, 8, 3)], 'ticker':['aapl', 'goog', 'yhoo'],\ - 'value': [5.63269, 4.45609, 2.74843]} + {'date': [ + dt.date(2021, 8, 1), dt.date(2021, 8, 2), dt.date(2021, 8, 3) + ], 'ticker': ['aapl', 'goog', 'yhoo'], 'value': [ + 5.63269, 4.45609, 2.74843 + ]} ) df.set_index( From 57622f113a2fbec79d6fe90c322281c805c84cc0 Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Mon, 18 Oct 2021 20:57:19 +0530 Subject: [PATCH 06/12] imports resolved --- pandas/core/indexes/multi.py | 4 ++-- pandas/tests/series/methods/test_reset_index.py | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 76baf169f7e15..622af15432f72 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1673,9 +1673,9 @@ def get_level_values(self, level): """ level = self._get_level_number(level) values = self._get_level_values(level) - import pandas as pd + from pandas import to_datetime try: - values = pd.to_datetime(values) + values = to_datetime(values) except ValueError: pass diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index a0097b008b287..ed5554f659763 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -1,5 +1,5 @@ from datetime import datetime - +import datetime as dt import numpy as np import pytest @@ -182,7 +182,6 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): def test_set_index_MultiIndex(): - import datetime as dt df = DataFrame( {'date': [ dt.date(2021, 8, 1), dt.date(2021, 8, 2), dt.date(2021, 8, 3) @@ -201,5 +200,4 @@ def test_set_index_MultiIndex(): name='date', freq=None ) - for i in range(len(ex)): - assert ex[i] == res[i] + tm.assert_index_equal(ex, res) From fb9591a9e3a2875927792f76f0f91f3500e91eed Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Mon, 18 Oct 2021 21:46:38 +0530 Subject: [PATCH 07/12] black --- pandas/core/indexes/multi.py | 1 + .../tests/series/methods/test_reset_index.py | 25 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 622af15432f72..a09461e315a37 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1674,6 +1674,7 @@ def get_level_values(self, level): level = self._get_level_number(level) values = self._get_level_values(level) from pandas import to_datetime + try: values = to_datetime(values) except ValueError: diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index ed5554f659763..5a984305fede0 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -1,5 +1,6 @@ -from datetime import datetime import datetime as dt +from datetime import datetime + import numpy as np import pytest @@ -183,21 +184,19 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): def test_set_index_MultiIndex(): df = DataFrame( - {'date': [ - dt.date(2021, 8, 1), dt.date(2021, 8, 2), dt.date(2021, 8, 3) - ], 'ticker': ['aapl', 'goog', 'yhoo'], 'value': [ - 5.63269, 4.45609, 2.74843 - ]} + { + "date": [dt.date(2021, 8, 1), dt.date(2021, 8, 2), dt.date(2021, 8, 3)], + "ticker": ["aapl", "goog", "yhoo"], + "value": [5.63269, 4.45609, 2.74843], + } ) - df.set_index( - ['date', 'ticker'], inplace=True - ) + df.set_index(["date", "ticker"], inplace=True) res = df.index.get_level_values(0) ex = pd.DatetimeIndex( - ['2021-08-01', '2021-08-02', '2021-08-03'], - dtype='datetime64[ns]', - name='date', - freq=None + ["2021-08-01", "2021-08-02", "2021-08-03"], + dtype="datetime64[ns]", + name="date", + freq=None, ) tm.assert_index_equal(ex, res) From 057600811efa403ff8b7d58f31a8d8452c91c916 Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Wed, 27 Oct 2021 17:44:38 +0530 Subject: [PATCH 08/12] Solved import dependency --- pandas/tests/series/methods/test_reset_index.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index 5a984305fede0..b541c52b59d1f 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -1,5 +1,4 @@ -import datetime as dt -from datetime import datetime +from datetime import datetime, date import numpy as np import pytest @@ -185,7 +184,7 @@ def test_reset_index_dtypes_on_empty_series_with_multiindex(array, dtype): def test_set_index_MultiIndex(): df = DataFrame( { - "date": [dt.date(2021, 8, 1), dt.date(2021, 8, 2), dt.date(2021, 8, 3)], + "date": [date(2021, 8, 1), date(2021, 8, 2), date(2021, 8, 3)], "ticker": ["aapl", "goog", "yhoo"], "value": [5.63269, 4.45609, 2.74843], } From 28fb6386cc112426c3df5dc7a668facc4854e204 Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Wed, 27 Oct 2021 22:46:25 +0530 Subject: [PATCH 09/12] try-except removed --- pandas/core/array_algos/take.py | 4 ++++ pandas/core/indexes/multi.py | 10 +++------- pandas/tests/series/methods/test_reset_index.py | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/pandas/core/array_algos/take.py b/pandas/core/array_algos/take.py index e1a29f0dbe395..7841e55d210dd 100644 --- a/pandas/core/array_algos/take.py +++ b/pandas/core/array_algos/take.py @@ -1,5 +1,6 @@ from __future__ import annotations +from datetime import date import functools from typing import ( TYPE_CHECKING, @@ -94,7 +95,10 @@ def take_nd( """ if fill_value is lib.no_default: fill_value = na_value_for_dtype(arr.dtype, compat=False) + if all(isinstance(x, date) for x in arr): + from pandas import to_datetime + return to_datetime(arr) if not isinstance(arr, np.ndarray): # i.e. ExtensionArray, # includes for EA to catch DatetimeArray, TimedeltaArray diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index a09461e315a37..13c2be27f9002 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -82,6 +82,7 @@ ensure_index, get_unanimous_names, ) +from pandas.core.indexes.datetimes import DatetimeIndex from pandas.core.indexes.frozen import FrozenList from pandas.core.indexes.numeric import Int64Index from pandas.core.ops.invalid import make_invalid_op @@ -1637,6 +1638,8 @@ def _get_level_values(self, level: int, unique: bool = False) -> Index: if unique: level_codes = algos.unique(level_codes) filled = algos.take_nd(lev._values, level_codes, fill_value=lev._na_value) + if not type(filled) == type(lev) and type(filled) == DatetimeIndex: + return filled.rename(name=name) return lev._shallow_copy(filled, name=name) def get_level_values(self, level): @@ -1673,13 +1676,6 @@ def get_level_values(self, level): """ level = self._get_level_number(level) values = self._get_level_values(level) - from pandas import to_datetime - - try: - values = to_datetime(values) - except ValueError: - pass - return values @doc(Index.unique) diff --git a/pandas/tests/series/methods/test_reset_index.py b/pandas/tests/series/methods/test_reset_index.py index b541c52b59d1f..90bee53a860b8 100644 --- a/pandas/tests/series/methods/test_reset_index.py +++ b/pandas/tests/series/methods/test_reset_index.py @@ -1,4 +1,7 @@ -from datetime import datetime, date +from datetime import ( + date, + datetime, +) import numpy as np import pytest From 92224e7595c83da0e0e1a6d42270b7e4056fe9dc Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Thu, 28 Oct 2021 07:19:09 +0530 Subject: [PATCH 10/12] Solved Index type issue --- pandas/core/array_algos/take.py | 3 --- pandas/core/indexes/base.py | 7 +++++-- pandas/core/indexes/multi.py | 2 -- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/pandas/core/array_algos/take.py b/pandas/core/array_algos/take.py index 7841e55d210dd..82db247da16cb 100644 --- a/pandas/core/array_algos/take.py +++ b/pandas/core/array_algos/take.py @@ -95,10 +95,7 @@ def take_nd( """ if fill_value is lib.no_default: fill_value = na_value_for_dtype(arr.dtype, compat=False) - if all(isinstance(x, date) for x in arr): - from pandas import to_datetime - return to_datetime(arr) if not isinstance(arr, np.ndarray): # i.e. ExtensionArray, # includes for EA to catch DatetimeArray, TimedeltaArray diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index c5cfa4c2d1fcd..ef099a3003bc4 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -1,6 +1,6 @@ from __future__ import annotations -from datetime import datetime +from datetime import datetime, date import functools from itertools import zip_longest import operator @@ -764,7 +764,10 @@ def _shallow_copy(self: _IndexT, values, name: Hashable = no_default) -> _IndexT name : Label, defaults to self.name """ name = self._name if name is no_default else name - + u = self._simple_new(values, name=name) + if all(isinstance(x, date) for x in u): + from pandas import to_datetime + return to_datetime(u) return self._simple_new(values, name=name) def _view(self: _IndexT) -> _IndexT: diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 13c2be27f9002..1b0e489a958ea 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1638,8 +1638,6 @@ def _get_level_values(self, level: int, unique: bool = False) -> Index: if unique: level_codes = algos.unique(level_codes) filled = algos.take_nd(lev._values, level_codes, fill_value=lev._na_value) - if not type(filled) == type(lev) and type(filled) == DatetimeIndex: - return filled.rename(name=name) return lev._shallow_copy(filled, name=name) def get_level_values(self, level): From ccecca580ccb86665952d6c05b9ac7bb4a87eddb Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Thu, 28 Oct 2021 07:22:30 +0530 Subject: [PATCH 11/12] pre-commit removed --- pandas/core/indexes/base.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index ef099a3003bc4..86f2793341d76 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -1,6 +1,9 @@ from __future__ import annotations -from datetime import datetime, date +from datetime import ( + date, + datetime, +) import functools from itertools import zip_longest import operator @@ -767,6 +770,7 @@ def _shallow_copy(self: _IndexT, values, name: Hashable = no_default) -> _IndexT u = self._simple_new(values, name=name) if all(isinstance(x, date) for x in u): from pandas import to_datetime + return to_datetime(u) return self._simple_new(values, name=name) From 5f6d79537b07ae1c9d16771879fc5cd73ba3ff39 Mon Sep 17 00:00:00 2001 From: shubham11941140 <63910248+shubham11941140@users.noreply.github.com> Date: Thu, 28 Oct 2021 07:26:24 +0530 Subject: [PATCH 12/12] import issue --- pandas/core/array_algos/take.py | 1 - pandas/core/indexes/multi.py | 1 - 2 files changed, 2 deletions(-) diff --git a/pandas/core/array_algos/take.py b/pandas/core/array_algos/take.py index 82db247da16cb..e1a29f0dbe395 100644 --- a/pandas/core/array_algos/take.py +++ b/pandas/core/array_algos/take.py @@ -1,6 +1,5 @@ from __future__ import annotations -from datetime import date import functools from typing import ( TYPE_CHECKING, diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 1b0e489a958ea..e2f1a2d6a1e23 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -82,7 +82,6 @@ ensure_index, get_unanimous_names, ) -from pandas.core.indexes.datetimes import DatetimeIndex from pandas.core.indexes.frozen import FrozenList from pandas.core.indexes.numeric import Int64Index from pandas.core.ops.invalid import make_invalid_op