From 46d5c9dc2bac300db892c0e8c89d31257c769488 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Wed, 17 Feb 2016 08:15:51 -0500 Subject: [PATCH] BUG: Bug in DataFrame.set_index() with tz-aware Series closes #12358 --- doc/source/whatsnew/v0.18.0.txt | 2 +- pandas/core/frame.py | 2 +- pandas/tests/frame/test_alter_axes.py | 12 +++++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/source/whatsnew/v0.18.0.txt b/doc/source/whatsnew/v0.18.0.txt index c749c4540013b..2baa366a29bb1 100644 --- a/doc/source/whatsnew/v0.18.0.txt +++ b/doc/source/whatsnew/v0.18.0.txt @@ -1045,7 +1045,7 @@ Bug Fixes - Bug in ``DataFrame.info`` when duplicated column names exist (:issue:`11761`) - Bug in ``.copy`` of datetime tz-aware objects (:issue:`11794`) - Bug in ``Series.apply`` and ``Series.map`` where ``timedelta64`` was not boxed (:issue:`11349`) - +- Bug in ``DataFrame.set_index()`` with tz-aware ``Series`` (:issue:`12358`) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 8a3ac4db37d2d..cd32ff2133cae 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -2810,7 +2810,7 @@ def set_index(self, keys, drop=True, append=False, inplace=False, level = col.get_level_values(col.nlevels - 1) names.extend(col.names) elif isinstance(col, Series): - level = col.values + level = col._values names.append(col.name) elif isinstance(col, Index): level = col diff --git a/pandas/tests/frame/test_alter_axes.py b/pandas/tests/frame/test_alter_axes.py index 2d7ba6c704e41..1da5487aefc01 100644 --- a/pandas/tests/frame/test_alter_axes.py +++ b/pandas/tests/frame/test_alter_axes.py @@ -7,7 +7,8 @@ import numpy as np from pandas.compat import lrange -from pandas import DataFrame, Series, Index, MultiIndex, RangeIndex +from pandas import (DataFrame, Series, Index, MultiIndex, + RangeIndex) import pandas as pd from pandas.util.testing import (assert_series_equal, @@ -267,6 +268,15 @@ def test_set_index_cast_datetimeindex(self): lambda d: pd.Timestamp(d, tz=tz)) assert_frame_equal(df.reset_index(), expected) + # GH 12358 + # tz-aware Series should retain the tz + i = pd.to_datetime(["2014-01-01 10:10:10"], + utc=True).tz_convert('Europe/Rome') + df = DataFrame({'i': i}) + self.assertEqual(df.set_index(i).index[0].hour, 11) + self.assertEqual(pd.DatetimeIndex(pd.Series(df.i))[0].hour, 11) + self.assertEqual(df.set_index(df.i).index[0].hour, 11) + def test_set_index_multiindexcolumns(self): columns = MultiIndex.from_tuples([('foo', 1), ('foo', 2), ('bar', 1)]) df = DataFrame(np.random.randn(3, 3), columns=columns)