Skip to content

Commit 9d58bbe

Browse files
stephenwlinchanghiskhan
authored andcommitted
BUG: naive datetime keys not localized to DateTimeIndex tz
1 parent b99f075 commit 9d58bbe

File tree

2 files changed

+54
-25
lines changed

2 files changed

+54
-25
lines changed

pandas/tests/test_series.py

+30-4
Original file line numberDiff line numberDiff line change
@@ -2576,6 +2576,31 @@ def test_getitem_setitem_datetimeindex(self):
25762576
expected = ts[4:8]
25772577
assert_series_equal(result, expected)
25782578

2579+
# repeat all the above with naive datetimes
2580+
result = ts[datetime(1990, 1, 1, 4)]
2581+
expected = ts[4]
2582+
self.assert_(result == expected)
2583+
2584+
result = ts.copy()
2585+
result[datetime(1990, 1, 1, 4)] = 0
2586+
result[datetime(1990, 1, 1, 4)] = ts[4]
2587+
assert_series_equal(result, ts)
2588+
2589+
result = ts[datetime(1990, 1, 1, 4):datetime(1990, 1, 1, 7)]
2590+
expected = ts[4:8]
2591+
assert_series_equal(result, expected)
2592+
2593+
result = ts.copy()
2594+
result[datetime(1990, 1, 1, 4):datetime(1990, 1, 1, 7)] = 0
2595+
result[datetime(1990, 1, 1, 4):datetime(1990, 1, 1, 7)] = ts[4:8]
2596+
assert_series_equal(result, ts)
2597+
2598+
lb = datetime(1990, 1, 1, 4)
2599+
rb = datetime(1990, 1, 1, 7)
2600+
result = ts[(ts.index >= lb) & (ts.index <= rb)]
2601+
expected = ts[4:8]
2602+
assert_series_equal(result, expected)
2603+
25792604
result = ts[ts.index[4]]
25802605
expected = ts[4]
25812606
self.assert_(result == expected)
@@ -2610,14 +2635,15 @@ def test_getitem_setitem_datetimeindex(self):
26102635
result["1990-01-01 03:00:00-06:00"] = ts[4]
26112636
assert_series_equal(result, ts)
26122637

2638+
# repeat with datetimes
26132639
result = ts.copy()
2614-
result[datetime(1990, 1, 1, 9, 0, 0, tzinfo=tz('UTC'))] = 0
2615-
result[datetime(1990, 1, 1, 9, 0, 0, tzinfo=tz('UTC'))] = ts[4]
2640+
result[datetime(1990, 1, 1, 9, tzinfo=tz('UTC'))] = 0
2641+
result[datetime(1990, 1, 1, 9, tzinfo=tz('UTC'))] = ts[4]
26162642
assert_series_equal(result, ts)
26172643

26182644
result = ts.copy()
2619-
result[datetime(1990, 1, 1, 3, 0, 0, tzinfo=tz('US/Central'))] = 0
2620-
result[datetime(1990, 1, 1, 3, 0, 0, tzinfo=tz('US/Central'))] = ts[4]
2645+
result[datetime(1990, 1, 1, 3, tzinfo=tz('US/Central'))] = 0
2646+
result[datetime(1990, 1, 1, 3, tzinfo=tz('US/Central'))] = ts[4]
26212647
assert_series_equal(result, ts)
26222648

26232649
def test_getitem_setitem_periodindex(self):

pandas/tseries/index.py

+24-21
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,11 @@ def _dt_index_cmp(opname):
6767
def wrapper(self, other):
6868
func = getattr(super(DatetimeIndex, self), opname)
6969
if isinstance(other, datetime):
70-
func = getattr(self, opname)
71-
other = _to_m8(other)
70+
other = _to_m8(other, tz=self.tz)
7271
elif isinstance(other, list):
7372
other = DatetimeIndex(other)
7473
elif isinstance(other, basestring):
75-
other = _to_m8(Timestamp(other, tz=self.tz))
74+
other = _to_m8(other, tz=self.tz)
7675
elif not isinstance(other, np.ndarray):
7776
other = _ensure_datetime64(other)
7877
result = func(other)
@@ -1092,6 +1091,11 @@ def get_value(self, series, key):
10921091
Fast lookup of value from 1-dimensional ndarray. Only use this if you
10931092
know what you're doing
10941093
"""
1094+
if isinstance(key, datetime):
1095+
# needed to localize naive datetimes
1096+
stamp = Timestamp(key, tz=self.tz)
1097+
return self._engine.get_value(series, stamp)
1098+
10951099
try:
10961100
return Index.get_value(self, series, key)
10971101
except KeyError:
@@ -1106,13 +1110,10 @@ def get_value(self, series, key):
11061110
return series.take(locs)
11071111

11081112
try:
1109-
if isinstance(key, basestring):
1110-
stamp = Timestamp(key, tz=self.tz)
1111-
else:
1112-
stamp = Timestamp(key)
1113+
stamp = Timestamp(key, tz=self.tz)
11131114
return self._engine.get_value(series, stamp)
1114-
except KeyError:
1115-
raise KeyError(stamp)
1115+
except (KeyError, ValueError):
1116+
raise KeyError(key)
11161117

11171118
def get_loc(self, key):
11181119
"""
@@ -1122,22 +1123,24 @@ def get_loc(self, key):
11221123
-------
11231124
loc : int
11241125
"""
1126+
if isinstance(key, datetime):
1127+
# needed to localize naive datetimes
1128+
stamp = Timestamp(key, tz=self.tz)
1129+
return self._engine.get_loc(stamp)
1130+
11251131
try:
1126-
return self._engine.get_loc(key)
1127-
except KeyError:
1132+
return Index.get_loc(self, key)
1133+
except (KeyError, ValueError):
11281134
try:
11291135
return self._get_string_slice(key)
11301136
except (TypeError, KeyError, ValueError):
11311137
pass
11321138

11331139
if isinstance(key, time):
11341140
return self.indexer_at_time(key)
1135-
1141+
11361142
try:
1137-
if isinstance(key, basestring):
1138-
stamp = Timestamp(key, tz=self.tz)
1139-
else:
1140-
stamp = Timestamp(key)
1143+
stamp = Timestamp(key, tz=self.tz)
11411144
return self._engine.get_loc(stamp)
11421145
except (KeyError, ValueError):
11431146
raise KeyError(key)
@@ -1256,7 +1259,7 @@ def searchsorted(self, key, side='left'):
12561259
if isinstance(key, np.ndarray):
12571260
key = np.array(key, dtype=_NS_DTYPE, copy=False)
12581261
else:
1259-
key = _to_m8(key)
1262+
key = _to_m8(key, tz=self.tz)
12601263

12611264
return self.values.searchsorted(key, side=side)
12621265

@@ -1345,7 +1348,7 @@ def insert(self, loc, item):
13451348
new_index : Index
13461349
"""
13471350
if isinstance(item, datetime):
1348-
item = _to_m8(item)
1351+
item = _to_m8(item, tz=self.tz)
13491352

13501353
new_index = np.concatenate((self[:loc].asi8,
13511354
[item.view(np.int64)],
@@ -1619,13 +1622,13 @@ def bdate_range(start=None, end=None, periods=None, freq='B', tz=None,
16191622
freq=freq, tz=tz, normalize=normalize, name=name)
16201623

16211624

1622-
def _to_m8(key):
1625+
def _to_m8(key, tz=None):
16231626
'''
16241627
Timestamp-like => dt64
16251628
'''
1626-
if not isinstance(key, (Timestamp, datetime)):
1629+
if not isinstance(key, Timestamp):
16271630
# this also converts strings
1628-
key = Timestamp(key)
1631+
key = Timestamp(key, tz=tz)
16291632

16301633
return np.int64(tslib.pydt_to_i8(key)).view(_NS_DTYPE)
16311634

0 commit comments

Comments
 (0)