From 3a91d0f0bdd42b85cc343a5e353410f9085c7b7e Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Mon, 6 Jul 2020 10:15:50 -0400 Subject: [PATCH 1/3] Fix regression on datetime in MultiIndex --- pandas/core/indexing.py | 3 +++ .../indexing/multiindex/test_datetime.py | 24 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 708b687434327..8026e15568b8c 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1165,6 +1165,9 @@ def _convert_to_indexer(self, key, axis: int, is_setter: bool = False): if len(key) == labels.nlevels: return {"key": key} raise + except InvalidIndexError: + if not isinstance(labels, ABCMultiIndex): + raise except TypeError: pass except ValueError: diff --git a/pandas/tests/indexing/multiindex/test_datetime.py b/pandas/tests/indexing/multiindex/test_datetime.py index 907d20cd5bd53..de6a26154d8ec 100644 --- a/pandas/tests/indexing/multiindex/test_datetime.py +++ b/pandas/tests/indexing/multiindex/test_datetime.py @@ -2,7 +2,16 @@ import numpy as np -from pandas import Index, Period, Series, period_range +from pandas import ( + DataFrame, + DatetimeIndex, + Index, + MultiIndex, + Period, + Series, + period_range, + to_datetime, +) def test_multiindex_period_datetime(): @@ -20,3 +29,16 @@ def test_multiindex_period_datetime(): # try datetime as index result = s.loc["a", datetime(2012, 1, 1)] assert result == expected + + +def test_multiindex_datetime_columns(): + # GH35015, using datetime as column indices raises exception + + mi = MultiIndex.from_tuples( + [(to_datetime("02/29/2020"), to_datetime("03/01/2020"))], names=["a", "b"] + ) + + df = DataFrame([], columns=mi) + assert list(df.columns.names) == ["a", "b"] + + assert all(isinstance(mi.get_level_values(i), DatetimeIndex) for i in range(2)) From e76e7bca35b20a5b0066eca6eac7e67e20816313 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jul 2020 09:44:08 -0400 Subject: [PATCH 2/3] change test to use assert_frame_equal, comment about code change --- pandas/core/indexing.py | 1 + pandas/tests/indexing/multiindex/test_datetime.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 8026e15568b8c..04d1dbceb3342 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1166,6 +1166,7 @@ def _convert_to_indexer(self, key, axis: int, is_setter: bool = False): return {"key": key} raise except InvalidIndexError: + # GH35015, using datetime as column indices raises exception if not isinstance(labels, ABCMultiIndex): raise except TypeError: diff --git a/pandas/tests/indexing/multiindex/test_datetime.py b/pandas/tests/indexing/multiindex/test_datetime.py index de6a26154d8ec..e10784b8e39e7 100644 --- a/pandas/tests/indexing/multiindex/test_datetime.py +++ b/pandas/tests/indexing/multiindex/test_datetime.py @@ -12,6 +12,7 @@ period_range, to_datetime, ) +import pandas._testing as tm def test_multiindex_period_datetime(): @@ -39,6 +40,12 @@ def test_multiindex_datetime_columns(): ) df = DataFrame([], columns=mi) - assert list(df.columns.names) == ["a", "b"] - assert all(isinstance(mi.get_level_values(i), DatetimeIndex) for i in range(2)) + expected_df = DataFrame( + [], + columns=MultiIndex.from_arrays( + [[to_datetime("02/29/2020")], [to_datetime("03/01/2020")]], names=["a", "b"] + ), + ) + + tm.assert_frame_equal(df, expected_df) From 2a0b224924a97b813dfaea48bb5abf0da95c3593 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jul 2020 10:06:53 -0400 Subject: [PATCH 3/3] fix import issue --- pandas/tests/indexing/multiindex/test_datetime.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/tests/indexing/multiindex/test_datetime.py b/pandas/tests/indexing/multiindex/test_datetime.py index e10784b8e39e7..a49cb0bc2c43e 100644 --- a/pandas/tests/indexing/multiindex/test_datetime.py +++ b/pandas/tests/indexing/multiindex/test_datetime.py @@ -4,7 +4,6 @@ from pandas import ( DataFrame, - DatetimeIndex, Index, MultiIndex, Period,