Skip to content

Commit 76f98b6

Browse files
committed
BUG: correctly handle py2.6 datetime64 in groupers
1 parent 9aaf67c commit 76f98b6

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

pandas/core/common.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,6 +2009,14 @@ def needs_i8_conversion(arr_or_dtype):
20092009
is_timedelta64_dtype(arr_or_dtype))
20102010

20112011

2012+
def is_numeric_dtype(arr_or_dtype):
2013+
if isinstance(arr_or_dtype, np.dtype):
2014+
tipo = arr_or_dtype.type
2015+
else:
2016+
tipo = arr_or_dtype.dtype.type
2017+
return (issubclass(tipo, (np.number, np.bool_))
2018+
and not issubclass(tipo, (np.datetime64, np.timedelta64)))
2019+
20122020
def is_float_dtype(arr_or_dtype):
20132021
if isinstance(arr_or_dtype, np.dtype):
20142022
tipo = arr_or_dtype.type

pandas/core/groupby.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
import pandas.core.algorithms as algos
2020
import pandas.core.common as com
2121
from pandas.core.common import(_possibly_downcast_to_dtype, isnull,
22-
notnull, _DATELIKE_DTYPES)
22+
notnull, _DATELIKE_DTYPES, is_numeric_dtype,
23+
is_timedelta64_dtype, is_datetime64_dtype)
2324

2425
import pandas.lib as lib
2526
from pandas.lib import Timestamp
@@ -260,9 +261,13 @@ def indices(self):
260261

261262
def _get_index(self, name):
262263
""" safe get index """
263-
if isinstance(name, Timestamp):
264-
name = name.value
265-
return self.indices[name]
264+
try:
265+
return self.indices[name]
266+
except:
267+
if isinstance(name, Timestamp):
268+
name = name.value
269+
return self.indices[name]
270+
raise
266271

267272
@property
268273
def name(self):
@@ -683,7 +688,7 @@ def _try_cast(self, result, obj):
683688
def _cython_agg_general(self, how, numeric_only=True):
684689
output = {}
685690
for name, obj in self._iterate_slices():
686-
is_numeric = _is_numeric_dtype(obj.dtype)
691+
is_numeric = is_numeric_dtype(obj.dtype)
687692
if numeric_only and not is_numeric:
688693
continue
689694

@@ -721,7 +726,7 @@ def _python_agg_general(self, func, *args, **kwargs):
721726

722727
# since we are masking, make sure that we have a float object
723728
values = result
724-
if _is_numeric_dtype(values.dtype):
729+
if is_numeric_dtype(values.dtype):
725730
values = com.ensure_float(values)
726731

727732
output[name] = self._try_cast(values[mask], result)
@@ -1087,7 +1092,7 @@ def aggregate(self, values, how, axis=0):
10871092
raise NotImplementedError
10881093
out_shape = (self.ngroups,) + values.shape[1:]
10891094

1090-
if _is_numeric_dtype(values.dtype):
1095+
if is_numeric_dtype(values.dtype):
10911096
values = com.ensure_float(values)
10921097
is_numeric = True
10931098
else:
@@ -1481,6 +1486,15 @@ def __init__(self, index, grouper=None, name=None, level=None,
14811486
self.grouper = None # Try for sanity
14821487
raise AssertionError(errmsg)
14831488

1489+
# if we have a date/time-like grouper, make sure that we have Timestamps like
1490+
if getattr(self.grouper,'dtype',None) is not None:
1491+
if is_datetime64_dtype(self.grouper):
1492+
from pandas import to_datetime
1493+
self.grouper = to_datetime(self.grouper)
1494+
elif is_timedelta64_dtype(self.grouper):
1495+
from pandas import to_timedelta
1496+
self.grouper = to_timedelta(self.grouper)
1497+
14841498
def __repr__(self):
14851499
return 'Grouping(%s)' % self.name
14861500

@@ -1928,7 +1942,7 @@ def _cython_agg_blocks(self, how, numeric_only=True):
19281942
for block in data.blocks:
19291943
values = block.values
19301944

1931-
is_numeric = _is_numeric_dtype(values.dtype)
1945+
is_numeric = is_numeric_dtype(values.dtype)
19321946

19331947
if numeric_only and not is_numeric:
19341948
continue
@@ -2980,12 +2994,6 @@ def _reorder_by_uniques(uniques, labels):
29802994
}
29812995

29822996

2983-
def _is_numeric_dtype(dt):
2984-
typ = dt.type
2985-
return (issubclass(typ, (np.number, np.bool_))
2986-
and not issubclass(typ, (np.datetime64, np.timedelta64)))
2987-
2988-
29892997
def _intercept_function(func):
29902998
return _func_table.get(func, func)
29912999

0 commit comments

Comments
 (0)