Skip to content

Commit 8cde377

Browse files
committed
BUG: handle various 1.6/1.7 bugs with datetime64 scalar handling close #1717
1 parent 39c735c commit 8cde377

File tree

4 files changed

+28
-10
lines changed

4 files changed

+28
-10
lines changed

RELEASE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ pandas 0.8.2
4343
- Fix case where Categorical group key was not being passed into index in
4444
GroupBy result (#1701)
4545
- Handle Ellipsis in Series.__getitem__/__setitem__ (#1721)
46+
- Fix some bugs with handling datetime64 scalars of other units in NumPy 1.6
47+
and 1.7 (#1717)
4648

4749
pandas 0.8.1
4850
============

pandas/core/series.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2725,7 +2725,8 @@ def _try_cast(arr):
27252725
dtype = np.object_
27262726

27272727
if dtype is None:
2728-
subarr = np.empty(len(index), dtype=type(value))
2728+
value, dtype = _dtype_from_scalar(value)
2729+
subarr = np.empty(len(index), dtype=dtype)
27292730
else:
27302731
subarr = np.empty(len(index), dtype=dtype)
27312732
subarr.fill(value)
@@ -2744,6 +2745,13 @@ def _try_cast(arr):
27442745

27452746
return subarr
27462747

2748+
def _dtype_from_scalar(val):
2749+
if isinstance(val, np.datetime64):
2750+
# ugly hacklet
2751+
val = lib.Timestamp(val).value
2752+
return val, np.dtype('M8[ns]')
2753+
return val, type(val)
2754+
27472755
def _get_rename_function(mapper):
27482756
if isinstance(mapper, (dict, Series)):
27492757
def f(x):

pandas/src/inference.pyx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -385,25 +385,25 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
385385
elif util.is_bool_object(val):
386386
seen_bool = 1
387387
bools[i] = val
388-
elif util.is_integer_object(val):
389-
seen_int = 1
390-
floats[i] = <float64_t> val
391-
complexes[i] = <double complex> val
392-
if not seen_null:
393-
ints[i] = val
394388
elif util.is_float_object(val):
395389
floats[i] = complexes[i] = val
396390
seen_float = 1
397-
elif util.is_complex_object(val):
398-
complexes[i] = val
399-
seen_complex = 1
400391
elif util.is_datetime64_object(val):
401392
if convert_datetime:
402393
idatetimes[i] = convert_to_tsobject(val).value
403394
seen_datetime = 1
404395
else:
405396
seen_object = 1
406397
# objects[i] = val.astype('O')
398+
elif util.is_integer_object(val):
399+
seen_int = 1
400+
floats[i] = <float64_t> val
401+
complexes[i] = <double complex> val
402+
if not seen_null:
403+
ints[i] = val
404+
elif util.is_complex_object(val):
405+
complexes[i] = val
406+
seen_complex = 1
407407
elif PyDateTime_Check(val):
408408
if convert_datetime:
409409
seen_datetime = 1

pandas/tseries/tests/test_timeseries.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,14 @@ def test_series_interpolate_method_values(self):
10351035
exp = ts.interpolate()
10361036
assert_series_equal(result, exp)
10371037

1038+
def test_frame_datetime64_handling_groupby(self):
1039+
# it works!
1040+
df = DataFrame([(3,np.datetime64('2012-07-03')),
1041+
(3,np.datetime64('2012-07-04'))],
1042+
columns = ['a', 'date'])
1043+
result = df.groupby('a').first()
1044+
self.assertEqual(result['date'][3].year, 2012)
1045+
10381046
def _simple_ts(start, end, freq='D'):
10391047
rng = date_range(start, end, freq=freq)
10401048
return Series(np.random.randn(len(rng)), index=rng)

0 commit comments

Comments
 (0)