Skip to content

Commit 3c6f7b9

Browse files
committed
BUG: datetime64 boxing when retrieving DataFrame cross-section. close #2272
1 parent 008ecd3 commit 3c6f7b9

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

RELEASE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ pandas 0.10.0
4747
- Fix major performance regression in DataFrame.iteritems (#
4848
- Fixes bug when negative period passed to Series/DataFrame.diff (#2266)
4949
- Escape tabs in console output to avoid alignment issues (#2038)
50+
- Properly box datetime64 values when retrieving cross-section from
51+
mixed-dtype DataFrame (#2272)
5052

5153
pandas 0.9.1
5254
============

pandas/core/internals.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def __init__(self, values, items, ref_items, ndim=2):
3232
self.items = _ensure_index(items)
3333
self.ref_items = _ensure_index(ref_items)
3434

35+
def _gi(self, arg):
36+
return self.values[arg]
37+
3538
@property
3639
def ref_locs(self):
3740
if self._ref_locs is None:
@@ -229,20 +232,20 @@ def replace(self, to_replace, value, inplace=False):
229232
if not isinstance(to_replace, (list, np.ndarray)):
230233
if self._can_hold_element(to_replace):
231234
to_replace = self._try_cast(to_replace)
232-
np.putmask(new_values, com.mask_missing(new_values, to_replace),
233-
value)
235+
msk = com.mask_missing(new_values, to_replace)
236+
np.putmask(new_values, msk, value)
234237
else:
235238
try:
236239
to_replace = np.array(to_replace, dtype=self.dtype)
237-
np.putmask(new_values, com.mask_missing(new_values, to_replace),
238-
value)
239-
except:
240+
msk = com.mask_missing(new_values, to_replace)
241+
np.putmask(new_values, msk, value)
242+
except Exception:
240243
to_replace = np.array(to_replace, dtype=object)
241244
for r in to_replace:
242245
if self._can_hold_element(r):
243246
r = self._try_cast(r)
244-
np.putmask(new_values, com.mask_missing(new_values, to_replace),
245-
value)
247+
msk = com.mask_missing(new_values, to_replace)
248+
np.putmask(new_values, msk, value)
246249

247250
if inplace:
248251
return self
@@ -312,8 +315,6 @@ def _mask_missing(array, missing_values):
312315
mask |= array == missing_values
313316
return mask
314317

315-
#-------------------------------------------------------------------------------
316-
# Is this even possible?
317318

318319
class FloatBlock(Block):
319320
_can_hold_na = True
@@ -332,6 +333,7 @@ def should_store(self, value):
332333
# unnecessarily
333334
return issubclass(value.dtype.type, np.floating)
334335

336+
335337
class ComplexBlock(Block):
336338
_can_hold_na = True
337339

@@ -347,6 +349,7 @@ def _try_cast(self, element):
347349
def should_store(self, value):
348350
return issubclass(value.dtype.type, np.complexfloating)
349351

352+
350353
class IntBlock(Block):
351354
_can_hold_na = False
352355

@@ -362,6 +365,7 @@ def _try_cast(self, element):
362365
def should_store(self, value):
363366
return com.is_integer_dtype(value)
364367

368+
365369
class BoolBlock(Block):
366370
_can_hold_na = False
367371

@@ -377,6 +381,7 @@ def _try_cast(self, element):
377381
def should_store(self, value):
378382
return issubclass(value.dtype.type, np.bool_)
379383

384+
380385
class ObjectBlock(Block):
381386
_can_hold_na = True
382387

@@ -402,6 +407,9 @@ def __init__(self, values, items, ref_items, ndim=2):
402407

403408
Block.__init__(self, values, items, ref_items, ndim=ndim)
404409

410+
def _gi(self, arg):
411+
return lib.Timestamp(self.values[arg])
412+
405413
def _can_hold_element(self, element):
406414
return com.is_integer(element) or isinstance(element, datetime)
407415

@@ -807,10 +815,9 @@ def fast_2d_xs(self, loc, copy=False):
807815
n = len(items)
808816
result = np.empty(n, dtype=dtype)
809817
for blk in self.blocks:
810-
values = blk.values
811818
for j, item in enumerate(blk.items):
812819
i = items.get_loc(item)
813-
result[i] = values[j, loc]
820+
result[i] = blk._gi((j, loc))
814821

815822
return result
816823

pandas/tests/test_format.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,13 @@ def test_timedelta64(self):
895895
#check this works
896896
#GH2146
897897

898+
def test_mixed_datetime64(self):
899+
df = DataFrame({'A': [1, 2],
900+
'B': ['2012-01-01', '2012-01-02']})
901+
df['B'] = pd.to_datetime(df.B)
902+
903+
result = repr(df.ix[0])
904+
self.assertTrue('2012-01-01' in result)
898905

899906
class TestEngFormatter(unittest.TestCase):
900907

0 commit comments

Comments
 (0)