Skip to content

Commit 02cc76b

Browse files
committed
BUG: not converting scalars properly to M8/m8 on assignment (GH6079)
1 parent b537df5 commit 02cc76b

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

pandas/core/common.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import codecs
99
import csv
1010
import types
11+
from datetime import datetime, timedelta
1112

1213
from numpy.lib.format import read_array, write_array
1314
import numpy as np
@@ -867,11 +868,14 @@ def _infer_dtype_from_scalar(val):
867868

868869
dtype = np.object_
869870

870-
elif isinstance(val, np.datetime64):
871-
# ugly hacklet
871+
elif isinstance(val, (np.datetime64, datetime)) and getattr(val,'tz',None) is None:
872872
val = lib.Timestamp(val).value
873873
dtype = np.dtype('M8[ns]')
874874

875+
elif isinstance(val, (np.timedelta64, timedelta)):
876+
val = tslib.convert_to_timedelta(val,'ns')
877+
dtype = np.dtype('m8[ns]')
878+
875879
elif is_bool(val):
876880
dtype = np.bool_
877881

pandas/tests/test_frame.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -10495,7 +10495,17 @@ def test_rank2(self):
1049510495
assert_frame_equal(result, expected)
1049610496

1049710497
# mixed-type frames
10498-
self.mixed_frame['foo'] = datetime.now()
10498+
self.mixed_frame['datetime'] = datetime.now()
10499+
self.mixed_frame['timedelta'] = timedelta(days=1,seconds=1)
10500+
self.assert_(self.mixed_frame['datetime'].dtype == 'M8[ns]')
10501+
self.assert_(self.mixed_frame['timedelta'].dtype == 'm8[ns]')
10502+
result = self.mixed_frame.get_dtype_counts().order()
10503+
expected = Series({ 'float64' : 4,
10504+
'object' : 1,
10505+
'datetime64[ns]' : 1,
10506+
'timedelta64[ns]' : 1}).order()
10507+
assert_series_equal(result,expected)
10508+
1049910509
result = self.mixed_frame.rank(1)
1050010510
expected = self.mixed_frame.rank(1, numeric_only=True)
1050110511
assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)