Skip to content

Commit 864c32b

Browse files
committed
BUG: Fix inserting TImedelta into Series, closes pandas-dev#22717
1 parent c64c9cb commit 864c32b

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

pandas/core/indexing.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
is_scalar,
2020
is_sequence,
2121
is_sparse,
22+
is_timedelta64_dtype,
2223
)
2324
from pandas.core.dtypes.generic import ABCDataFrame, ABCSeries
2425
from pandas.core.dtypes.missing import _infer_fill_value, isna
@@ -429,11 +430,23 @@ def _setitem_with_indexer(self, indexer, value):
429430
# this preserves dtype of the value
430431
new_values = Series([value])._values
431432
if len(self.obj._values):
432-
try:
433-
new_values = np.concatenate([self.obj._values, new_values])
434-
except TypeError:
433+
if is_timedelta64_dtype(
434+
new_values
435+
) and not is_timedelta64_dtype(self.obj):
436+
# GH#22717 np.concatenate incorrect casts
437+
# timedelta64 to integer
435438
as_obj = self.obj.astype(object)
436-
new_values = np.concatenate([as_obj, new_values])
439+
new_values = np.concatenate(
440+
[as_obj, np.array([value], dtype=object)]
441+
)
442+
else:
443+
try:
444+
new_values = np.concatenate(
445+
[self.obj._values, new_values]
446+
)
447+
except TypeError:
448+
as_obj = self.obj.astype(object)
449+
new_values = np.concatenate([as_obj, new_values])
437450
self.obj._data = self.obj._constructor(
438451
new_values, index=new_index, name=self.obj.name
439452
)._data

pandas/tests/series/indexing/test_indexing.py

+9
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,15 @@ def test_timedelta_assignment():
653653
expected.loc[[1, 2, 3]] = pd.Timedelta(np.timedelta64(20, "m"))
654654
tm.assert_series_equal(s, expected)
655655

656+
# GH#22717 inserting a Timedelta should _not_ cast to int64
657+
ser = pd.Series(["x"])
658+
ser["td"] = pd.Timedelta("9 days")
659+
assert isinstance(ser["td"], pd.Timedelta)
660+
661+
ser = pd.Series(["x"])
662+
ser.loc["td"] = pd.Timedelta("9 days")
663+
assert isinstance(ser["td"], pd.Timedelta)
664+
656665

657666
def test_underlying_data_conversion():
658667
# GH 4080

0 commit comments

Comments
 (0)