From 864c32b5aad502f4d03e35da147b4b79122c4f24 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 8 Jul 2019 19:09:30 -0700 Subject: [PATCH] BUG: Fix inserting TImedelta into Series, closes #22717 --- pandas/core/indexing.py | 21 +++++++++++++++---- pandas/tests/series/indexing/test_indexing.py | 9 ++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index e27f85eb6d0a4..235801d0a9359 100755 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -19,6 +19,7 @@ is_scalar, is_sequence, is_sparse, + is_timedelta64_dtype, ) from pandas.core.dtypes.generic import ABCDataFrame, ABCSeries from pandas.core.dtypes.missing import _infer_fill_value, isna @@ -429,11 +430,23 @@ def _setitem_with_indexer(self, indexer, value): # this preserves dtype of the value new_values = Series([value])._values if len(self.obj._values): - try: - new_values = np.concatenate([self.obj._values, new_values]) - except TypeError: + if is_timedelta64_dtype( + new_values + ) and not is_timedelta64_dtype(self.obj): + # GH#22717 np.concatenate incorrect casts + # timedelta64 to integer as_obj = self.obj.astype(object) - new_values = np.concatenate([as_obj, new_values]) + new_values = np.concatenate( + [as_obj, np.array([value], dtype=object)] + ) + else: + try: + new_values = np.concatenate( + [self.obj._values, new_values] + ) + except TypeError: + as_obj = self.obj.astype(object) + new_values = np.concatenate([as_obj, new_values]) self.obj._data = self.obj._constructor( new_values, index=new_index, name=self.obj.name )._data diff --git a/pandas/tests/series/indexing/test_indexing.py b/pandas/tests/series/indexing/test_indexing.py index c8342c54e9b5d..7ffbbbd6125c5 100644 --- a/pandas/tests/series/indexing/test_indexing.py +++ b/pandas/tests/series/indexing/test_indexing.py @@ -653,6 +653,15 @@ def test_timedelta_assignment(): expected.loc[[1, 2, 3]] = pd.Timedelta(np.timedelta64(20, "m")) tm.assert_series_equal(s, expected) + # GH#22717 inserting a Timedelta should _not_ cast to int64 + ser = pd.Series(["x"]) + ser["td"] = pd.Timedelta("9 days") + assert isinstance(ser["td"], pd.Timedelta) + + ser = pd.Series(["x"]) + ser.loc["td"] = pd.Timedelta("9 days") + assert isinstance(ser["td"], pd.Timedelta) + def test_underlying_data_conversion(): # GH 4080