From 9e57d6d212a4edf9227c137cf56ca92239dfb4f5 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 21 Dec 2021 13:39:55 -0500 Subject: [PATCH 1/5] fix column_arrays for array manager --- pandas/core/internals/array_manager.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 09f16a2ddab67..06849bffff5ca 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -794,7 +794,14 @@ def column_arrays(self) -> list[ArrayLike]: """ Used in the JSON C code to access column arrays. """ - return self.arrays + + def convert_array(arr: ArrayLike) -> ArrayLike: + if isinstance(arr, ExtensionArray): + return arr.to_numpy() + else: + return arr + + return [convert_array(arr) for arr in self.arrays] def iset( self, loc: int | slice | np.ndarray, value: ArrayLike, inplace: bool = False From 84b119faea9b3409c5f1a1afe388b77bfff29e45 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 23 Feb 2022 07:24:01 -0500 Subject: [PATCH 2/5] remove dead code in arrays/interval.py --- pandas/core/arrays/interval.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index d23910c37b52b..d809ad90ad1b5 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -1664,12 +1664,8 @@ def _from_combined(self, combined: np.ndarray) -> IntervalArray: nc = combined.view("i8").reshape(-1, 2) dtype = self._left.dtype - if needs_i8_conversion(dtype): - new_left = type(self._left)._from_sequence(nc[:, 0], dtype=dtype) - new_right = type(self._right)._from_sequence(nc[:, 1], dtype=dtype) - else: - new_left = nc[:, 0].view(dtype) - new_right = nc[:, 1].view(dtype) + new_left = nc[:, 0].view(dtype) + new_right = nc[:, 1].view(dtype) return self._shallow_copy(left=new_left, right=new_right) def unique(self) -> IntervalArray: From 64fedddc8d03f8b6ebfad6ce5827c9d778f0a1b7 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Fri, 25 Feb 2022 14:51:00 -0500 Subject: [PATCH 3/5] Undo Revert "remove dead code in arrays/interval.py" This reverts commit 84b119faea9b3409c5f1a1afe388b77bfff29e45. --- pandas/core/arrays/interval.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index d809ad90ad1b5..d23910c37b52b 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -1664,8 +1664,12 @@ def _from_combined(self, combined: np.ndarray) -> IntervalArray: nc = combined.view("i8").reshape(-1, 2) dtype = self._left.dtype - new_left = nc[:, 0].view(dtype) - new_right = nc[:, 1].view(dtype) + if needs_i8_conversion(dtype): + new_left = type(self._left)._from_sequence(nc[:, 0], dtype=dtype) + new_right = type(self._right)._from_sequence(nc[:, 1], dtype=dtype) + else: + new_left = nc[:, 0].view(dtype) + new_right = nc[:, 1].view(dtype) return self._shallow_copy(left=new_left, right=new_right) def unique(self) -> IntervalArray: From fa8c3338239d57f9ba70128ff882a47b04326197 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Fri, 25 Feb 2022 15:22:59 -0500 Subject: [PATCH 4/5] Adding tests for IntervalArray.unique() for DateTimeArrays with time zones --- pandas/tests/arrays/interval/test_interval.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pandas/tests/arrays/interval/test_interval.py b/pandas/tests/arrays/interval/test_interval.py index 5ef69106f0278..bb6ced2f98150 100644 --- a/pandas/tests/arrays/interval/test_interval.py +++ b/pandas/tests/arrays/interval/test_interval.py @@ -376,3 +376,18 @@ def test_arrow_table_roundtrip_without_metadata(breaks): result = table.to_pandas() assert isinstance(result["a"].dtype, pd.IntervalDtype) tm.assert_frame_equal(result, df) + + +def test_tz_unique(): + # GH 46128 + dti1 = date_range("2016-01-01", periods=3) + ii1 = IntervalIndex.from_breaks(dti1) + ser1 = pd.Series(ii1) + uni1 = ser1.unique() + + dti2 = date_range("2016-01-01", periods=3, tz="US/Eastern") + ii2 = IntervalIndex.from_breaks(dti2) + ser2 = pd.Series(ii2) + uni2 = ser2.unique() + + assert uni1.dtype != uni2.dtype From a517e3e6f2dcd4f253c25056f8d703f7469fdad0 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Fri, 25 Feb 2022 21:02:49 -0500 Subject: [PATCH 5/5] move tests to series/methods/test_unique --- pandas/tests/arrays/interval/test_interval.py | 15 --------------- pandas/tests/series/methods/test_unique.py | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/pandas/tests/arrays/interval/test_interval.py b/pandas/tests/arrays/interval/test_interval.py index bb6ced2f98150..5ef69106f0278 100644 --- a/pandas/tests/arrays/interval/test_interval.py +++ b/pandas/tests/arrays/interval/test_interval.py @@ -376,18 +376,3 @@ def test_arrow_table_roundtrip_without_metadata(breaks): result = table.to_pandas() assert isinstance(result["a"].dtype, pd.IntervalDtype) tm.assert_frame_equal(result, df) - - -def test_tz_unique(): - # GH 46128 - dti1 = date_range("2016-01-01", periods=3) - ii1 = IntervalIndex.from_breaks(dti1) - ser1 = pd.Series(ii1) - uni1 = ser1.unique() - - dti2 = date_range("2016-01-01", periods=3, tz="US/Eastern") - ii2 = IntervalIndex.from_breaks(dti2) - ser2 = pd.Series(ii2) - uni2 = ser2.unique() - - assert uni1.dtype != uni2.dtype diff --git a/pandas/tests/series/methods/test_unique.py b/pandas/tests/series/methods/test_unique.py index 856fe6e7c4f04..58a640837b10b 100644 --- a/pandas/tests/series/methods/test_unique.py +++ b/pandas/tests/series/methods/test_unique.py @@ -2,7 +2,9 @@ from pandas import ( Categorical, + IntervalIndex, Series, + date_range, ) import pandas._testing as tm @@ -50,3 +52,19 @@ def test_unique_categorical(self): ser = Series(cat) result = ser.unique() tm.assert_categorical_equal(result, cat) + + def test_tz_unique(self): + # GH 46128 + dti1 = date_range("2016-01-01", periods=3) + ii1 = IntervalIndex.from_breaks(dti1) + ser1 = Series(ii1) + uni1 = ser1.unique() + tm.assert_interval_array_equal(ser1.array, uni1) + + dti2 = date_range("2016-01-01", periods=3, tz="US/Eastern") + ii2 = IntervalIndex.from_breaks(dti2) + ser2 = Series(ii2) + uni2 = ser2.unique() + tm.assert_interval_array_equal(ser2.array, uni2) + + assert uni1.dtype != uni2.dtype