Skip to content

Commit 7d2603d

Browse files
committed
TST: interactions between array of datetime objects and DatetimeIndex, bug fixes
1 parent a63ff1a commit 7d2603d

File tree

3 files changed

+95
-7
lines changed

3 files changed

+95
-7
lines changed

pandas/core/datetools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ def ole2datetime(oledt):
775775
return OLE_TIME_ZERO + timedelta(days=val)
776776

777777

778-
class DateParseError(Exception):
778+
class DateParseError(ValueError):
779779
pass
780780

781781
_dtparser = parser.parser()

pandas/core/index.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,6 +1533,20 @@ def union(self, other):
15331533
else:
15341534
return Index.union(self, other)
15351535

1536+
def join(self, other, how='left', level=None, return_indexers=False):
1537+
"""
1538+
See Index.join
1539+
"""
1540+
if not isinstance(other, DatetimeIndex) and len(other) > 0:
1541+
try:
1542+
other = DatetimeIndex(other)
1543+
except ValueError:
1544+
pass
1545+
1546+
return Index.join(self, other, how=how, level=level,
1547+
return_indexers=return_indexers)
1548+
1549+
15361550
def _wrap_joined_index(self, joined, other):
15371551
name = self.name if self.name == other.name else None
15381552
if (isinstance(other, DatetimeIndex)
@@ -1545,6 +1559,9 @@ def _wrap_joined_index(self, joined, other):
15451559
return DatetimeIndex(joined, name=name)
15461560

15471561
def _can_fast_union(self, other):
1562+
if not isinstance(other, DatetimeIndex):
1563+
return False
1564+
15481565
offset = self.offset
15491566

15501567
if offset is None:
@@ -1612,8 +1629,14 @@ def intersection(self, other):
16121629
-------
16131630
y : Index or DatetimeIndex
16141631
"""
1615-
if other.offset != self.offset:
1616-
return super(DatetimeIndex, self).intersection(self, other)
1632+
if not isinstance(other, DatetimeIndex):
1633+
try:
1634+
other = DatetimeIndex(other)
1635+
except TypeError:
1636+
pass
1637+
return Index.intersection(self, other)
1638+
elif other.offset != self.offset:
1639+
return Index.intersection(self, other)
16171640

16181641
# to make our life easier, "sort" the two ranges
16191642
if self[0] <= other[0]:

pandas/tests/test_timeseries.py

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,17 +270,82 @@ def test_unpickle_legacy_series(self):
270270
self.assertEquals(unpickled.index.offset, BDay(1))
271271

272272
def test_arithmetic_interaction(self):
273-
pass
273+
index = self.frame.index
274+
obj_index = index.asobject
275+
276+
dseries = Series(rand(len(index)), index=index)
277+
oseries = Series(dseries.values, index=obj_index)
278+
279+
result = dseries + oseries
280+
expected = dseries * 2
281+
self.assert_(isinstance(result.index, DatetimeIndex))
282+
assert_series_equal(result, expected)
283+
284+
result = dseries + oseries[:5]
285+
expected = dseries + dseries[:5]
286+
self.assert_(isinstance(result.index, DatetimeIndex))
287+
assert_series_equal(result, expected)
274288

275289
def test_join_interaction(self):
276-
pass
290+
index = self.frame.index
291+
obj_index = index.asobject
292+
293+
def _check_join(left, right, how='inner'):
294+
ra, rb, rc = left.join(right, how=how, return_indexers=True)
295+
ea, eb, ec = left.join(DatetimeIndex(right), how=how,
296+
return_indexers=True)
297+
298+
self.assert_(isinstance(ra, DatetimeIndex))
299+
self.assert_(ra.equals(ea))
300+
301+
assert_almost_equal(rb, eb)
302+
assert_almost_equal(rc, ec)
303+
304+
_check_join(index[:15], obj_index[5:], how='inner')
305+
_check_join(index[:15], obj_index[5:], how='outer')
306+
_check_join(index[:15], obj_index[5:], how='right')
307+
_check_join(index[:15], obj_index[5:], how='left')
277308

278309
def test_setops(self):
279-
pass
310+
index = self.frame.index
311+
obj_index = index.asobject
312+
313+
result = index[:5].union(obj_index[5:])
314+
expected = index
315+
self.assert_(isinstance(result, DatetimeIndex))
316+
self.assert_(result.equals(expected))
317+
318+
result = index[:10].intersection(obj_index[5:])
319+
expected = index[5:10]
320+
self.assert_(isinstance(result, DatetimeIndex))
321+
self.assert_(result.equals(expected))
322+
323+
result = index[:10] - obj_index[5:]
324+
expected = index[:5]
325+
self.assert_(isinstance(result, DatetimeIndex))
326+
self.assert_(result.equals(expected))
280327

281328
def test_index_conversion(self):
282-
pass
329+
index = self.frame.index
330+
obj_index = index.asobject
331+
332+
conv = DatetimeIndex(obj_index)
333+
self.assert_(conv.equals(index))
334+
335+
self.assertRaises(ValueError, DatetimeIndex, ['a', 'b', 'c', 'd'])
336+
337+
def test_setops_conversion_fail(self):
338+
index = self.frame.index
339+
340+
right = Index(['a', 'b', 'c', 'd'])
341+
342+
result = index.union(right)
343+
expected = Index(np.concatenate([index.asobject, right]))
344+
self.assert_(result.equals(expected))
283345

346+
result = index.intersection(right)
347+
expected = Index([])
348+
self.assert_(result.equals(expected))
284349

285350

286351
class TestDatetime64(unittest.TestCase):

0 commit comments

Comments
 (0)