Skip to content

Commit 299fb75

Browse files
sinhrksjreback
authored andcommitted
BUG: Series creation with datetime64 with non-ns unit as object dtype (pandas-dev#13876)
1 parent d4f95fd commit 299fb75

File tree

4 files changed

+17
-4
lines changed

4 files changed

+17
-4
lines changed

doc/source/whatsnew/v0.19.0.txt

+2
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,8 @@ Bug Fixes
842842
- Bug in ``RangeIndex`` can be created without no arguments rather than raises ``TypeError`` (:issue:`13793`)
843843
- Bug in ``.value_counts`` raises ``OutOfBoundsDatetime`` if data exceeds ``datetime64[ns]`` bounds (:issue:`13663`)
844844
- Bug in ``DatetimeIndex`` may raise ``OutOfBoundsDatetime`` if input ``np.datetime64`` has other unit than ``ns`` (:issue:`9114`)
845+
- Bug in ``Series`` creation with ``np.datetime64`` which has other unit than ``ns`` as ``object`` dtype results in incorrect values (:issue:`13876`)
846+
845847
- Bug in ``isnull`` ``notnull`` raise ``TypeError`` if input datetime-like has other unit than ``ns`` (:issue:`13389`)
846848
- Bug in ``.merge`` may raise ``TypeError`` if input datetime-like has other unit than ``ns`` (:issue:`13389`)
847849

pandas/tests/series/test_constructors.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -381,13 +381,21 @@ def test_constructor_dtype_datetime64(self):
381381
# coerce datetime64 non-ns properly
382382
dates = date_range('01-Jan-2015', '01-Dec-2015', freq='M')
383383
values2 = dates.view(np.ndarray).astype('datetime64[ns]')
384-
expected = Series(values2, dates)
384+
expected = Series(values2, index=dates)
385385

386386
for dtype in ['s', 'D', 'ms', 'us', 'ns']:
387387
values1 = dates.view(np.ndarray).astype('M8[{0}]'.format(dtype))
388388
result = Series(values1, dates)
389389
assert_series_equal(result, expected)
390390

391+
# GH 13876
392+
# coerce to non-ns to object properly
393+
expected = Series(values2, index=dates, dtype=object)
394+
for dtype in ['s', 'D', 'ms', 'us', 'ns']:
395+
values1 = dates.view(np.ndarray).astype('M8[{0}]'.format(dtype))
396+
result = Series(values1, index=dates, dtype=object)
397+
assert_series_equal(result, expected)
398+
391399
# leave datetime.date alone
392400
dates2 = np.array([d.date() for d in dates.to_pydatetime()],
393401
dtype=object)

pandas/tests/test_algos.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,6 @@ def test_datetime_likes(self):
777777
exp_false = exp_first | exp_last
778778

779779
for case in cases:
780-
print(case)
781780
res_first = algos.duplicated(case, keep='first')
782781
tm.assert_numpy_array_equal(res_first, exp_first)
783782

@@ -788,7 +787,8 @@ def test_datetime_likes(self):
788787
tm.assert_numpy_array_equal(res_false, exp_false)
789788

790789
# index
791-
for idx in [pd.Index(case), pd.Index(case, dtype='category')]:
790+
for idx in [pd.Index(case), pd.Index(case, dtype='category'),
791+
pd.Index(case, dtype=object)]:
792792
res_first = idx.duplicated(keep='first')
793793
tm.assert_numpy_array_equal(res_first, exp_first)
794794

@@ -799,7 +799,8 @@ def test_datetime_likes(self):
799799
tm.assert_numpy_array_equal(res_false, exp_false)
800800

801801
# series
802-
for s in [pd.Series(case), pd.Series(case, dtype='category')]:
802+
for s in [pd.Series(case), pd.Series(case, dtype='category'),
803+
pd.Series(case, dtype=object)]:
803804
res_first = s.duplicated(keep='first')
804805
tm.assert_series_equal(res_first, pd.Series(exp_first))
805806

pandas/types/cast.py

+2
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,8 @@ def _possibly_cast_to_datetime(value, dtype, errors='raise'):
829829
# coerce datetimelike to object
830830
elif is_datetime64_dtype(value) and not is_datetime64_dtype(dtype):
831831
if is_object_dtype(dtype):
832+
if value.dtype != _NS_DTYPE:
833+
value = value.astype(_NS_DTYPE)
832834
ints = np.asarray(value).view('i8')
833835
return tslib.ints_to_pydatetime(ints)
834836

0 commit comments

Comments
 (0)