Repository: pandas-dev/pandas

Issue:
Timedelta interpreted as int upon first insertion into Series
#### Code Sample, a copy-pastable example if possible

```python
>>> s = pd.Series(['x'])
>>> s['td'] = pd.Timedelta('9 days')
>>> s
0                   x
td    777600000000000
dtype: object

# However, *if the key already exists*, it works as expected:
>>> s['td_2'] = 0
>>> s['td_2'] = pd.Timedelta('9 days')
>>> s
0                    x
td     777600000000000
td_2   9 days 00:00:00
dtype: object
```
#### Problem description

Timedeltas should remain Timedeltas when inserted into object Series, particularly because they are nice to work with. :sweat_smile: 

#### Expected Output

```python
>>> s = pd.Series(['x'])
>>> s['td'] = pd.Timedelta('9 days')
>>> s
0                    x
td     9 days 00:00:00
dtype: object

```

#### Output of ``pd.show_versions()``

<details>

pandas 0.23.3

</details>



Discussion:
xref #13829

Resolving patch:
diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py
--- a/pandas/core/indexing.py
+++ b/pandas/core/indexing.py
@@ -20,6 +20,7 @@
     is_sequence,
     is_sparse,
 )
+from pandas.core.dtypes.concat import _concat_compat
 from pandas.core.dtypes.generic import ABCDataFrame, ABCSeries
 from pandas.core.dtypes.missing import _infer_fill_value, isna
 
@@ -432,11 +433,9 @@ 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:
-                            as_obj = self.obj.astype(object)
-                            new_values = np.concatenate([as_obj, new_values])
+                        # GH#22717 handle casting compatibility that np.concatenate
+                        #  does incorrectly
+                        new_values = _concat_compat([self.obj._values, new_values])
                     self.obj._data = self.obj._constructor(
                         new_values, index=new_index, name=self.obj.name
                     )._data


Test patch:
diff --git a/pandas/tests/series/indexing/test_indexing.py b/pandas/tests/series/indexing/test_indexing.py
--- a/pandas/tests/series/indexing/test_indexing.py
+++ b/pandas/tests/series/indexing/test_indexing.py
@@ -654,6 +654,29 @@ def test_timedelta_assignment():
     tm.assert_series_equal(s, expected)
 
 
+@pytest.mark.parametrize(
+    "td",
+    [
+        pd.Timedelta("9 days"),
+        pd.Timedelta("9 days").to_timedelta64(),
+        pd.Timedelta("9 days").to_pytimedelta(),
+    ],
+)
+def test_append_timedelta_does_not_cast(td):
+    # GH#22717 inserting a Timedelta should _not_ cast to int64
+    expected = pd.Series(["x", td], index=[0, "td"], dtype=object)
+
+    ser = pd.Series(["x"])
+    ser["td"] = td
+    tm.assert_series_equal(ser, expected)
+    assert isinstance(ser["td"], pd.Timedelta)
+
+    ser = pd.Series(["x"])
+    ser.loc["td"] = pd.Timedelta("9 days")
+    tm.assert_series_equal(ser, expected)
+    assert isinstance(ser["td"], pd.Timedelta)
+
+
 def test_underlying_data_conversion():
     # GH 4080
     df = DataFrame({c: [1, 2, 3] for c in ["a", "b", "c"]})