Skip to content

Commit 3152bdc

Browse files
committed
BUG: getitem and a series with a non-ndarray values
closes #12089 closes #12151
1 parent d77f072 commit 3152bdc

File tree

5 files changed

+45
-6
lines changed

5 files changed

+45
-6
lines changed

doc/source/whatsnew/v0.18.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ Bug Fixes
483483
- Compat for numpy 1.11 w.r.t. ``NaT`` comparison changes (:issue:`12049`)
484484
- Bug in ``read_csv`` when reading from a ``StringIO`` in threads (:issue:`11790`)
485485
- Bug in not treating ``NaT`` as a missing value in datetimelikes when factorizing & with ``Categoricals`` (:issue:`12077`)
486-
486+
- Bug in getitem when the values of a ``Series`` were tz-aware (:issue:`12089`)
487487

488488

489489

pandas/index.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ cdef class IndexEngine:
100100
hash(val)
101101
return val in self.mapping
102102

103-
cpdef get_value(self, ndarray arr, object key):
103+
cpdef get_value(self, ndarray arr, object key, object tz=None):
104104
'''
105105
arr : 1-dimensional ndarray
106106
'''
@@ -113,7 +113,7 @@ cdef class IndexEngine:
113113
return arr[loc]
114114
else:
115115
if arr.descr.type_num == NPY_DATETIME:
116-
return Timestamp(util.get_value_at(arr, loc))
116+
return Timestamp(util.get_value_at(arr, loc), tz=tz)
117117
elif arr.descr.type_num == NPY_TIMEDELTA:
118118
return Timedelta(util.get_value_at(arr, loc))
119119
return util.get_value_at(arr, loc)

pandas/indexes/base.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -1881,7 +1881,12 @@ def get_value(self, series, key):
18811881
# use this, e.g. DatetimeIndex
18821882
s = getattr(series, '_values', None)
18831883
if isinstance(s, Index) and lib.isscalar(key):
1884-
return s[key]
1884+
try:
1885+
return s[key]
1886+
except (IndexError, ValueError):
1887+
1888+
# invalid type as an indexer
1889+
pass
18851890

18861891
s = _values_from_object(series)
18871892
k = _values_from_object(key)
@@ -1891,7 +1896,8 @@ def get_value(self, series, key):
18911896
raise KeyError
18921897

18931898
try:
1894-
return self._engine.get_value(s, k)
1899+
return self._engine.get_value(s, k,
1900+
tz=getattr(series.dtype, 'tz', None))
18951901
except KeyError as e1:
18961902
if len(self) > 0 and self.inferred_type in ['integer', 'boolean']:
18971903
raise

pandas/tests/series/test_indexing.py

+32
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,18 @@ def test_basic_getitem_with_labels(self):
613613
expected = s.reindex(arr_inds)
614614
assert_series_equal(result, expected)
615615

616+
# GH12089
617+
# with tz for values
618+
s = Series(pd.date_range("2011-01-01", periods=3, tz="US/Eastern"),
619+
index=['a', 'b', 'c'])
620+
expected = Timestamp('2011-01-01', tz='US/Eastern')
621+
result = s.loc['a']
622+
self.assertEqual(result, expected)
623+
result = s.iloc[0]
624+
self.assertEqual(result, expected)
625+
result = s['a']
626+
self.assertEqual(result, expected)
627+
616628
def test_basic_setitem_with_labels(self):
617629
indices = self.ts.index[[5, 10, 15]]
618630

@@ -650,6 +662,26 @@ def test_basic_setitem_with_labels(self):
650662
self.assertRaises(Exception, s.__setitem__, inds_notfound, 0)
651663
self.assertRaises(Exception, s.__setitem__, arr_inds_notfound, 0)
652664

665+
# GH12089
666+
# with tz for values
667+
s = Series(pd.date_range("2011-01-01", periods=3, tz="US/Eastern"),
668+
index=['a', 'b', 'c'])
669+
s2 = s.copy()
670+
expected = Timestamp('2011-01-03', tz='US/Eastern')
671+
s2.loc['a'] = expected
672+
result = s2.loc['a']
673+
self.assertEqual(result, expected)
674+
675+
s2 = s.copy()
676+
s2.iloc[0] = expected
677+
result = s2.iloc[0]
678+
self.assertEqual(result, expected)
679+
680+
s2 = s.copy()
681+
s2['a'] = expected
682+
result = s2['a']
683+
self.assertEqual(result, expected)
684+
653685
def test_ix_getitem(self):
654686
inds = self.series.index[[3, 4, 7]]
655687
assert_series_equal(self.series.ix[inds], self.series.reindex(inds))

pandas/tseries/index.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1361,7 +1361,8 @@ def get_value_maybe_box(self, series, key):
13611361
key = Timestamp(key, tz=self.tz)
13621362
elif not isinstance(key, Timestamp):
13631363
key = Timestamp(key)
1364-
values = self._engine.get_value(_values_from_object(series), key)
1364+
values = self._engine.get_value(_values_from_object(series),
1365+
key, tz=self.tz)
13651366
return _maybe_box(self, values, series, key)
13661367

13671368
def get_loc(self, key, method=None, tolerance=None):

0 commit comments

Comments
 (0)