Skip to content

Commit

Permalink
API: Make .shift always copy (Fixes pandas-dev#22397) (pandas-dev#22517)
Browse files Browse the repository at this point in the history
  • Loading branch information
AaronCritchley authored and victor committed Sep 30, 2018
1 parent e9721ed commit 0eeceeb
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 2 deletions.
1 change: 1 addition & 0 deletions doc/source/whatsnew/v0.24.0.txt
Expand Up @@ -544,6 +544,7 @@ Other API Changes
- :class:`Index` subtraction will attempt to operate element-wise instead of raising ``TypeError`` (:issue:`19369`)
- :class:`pandas.io.formats.style.Styler` supports a ``number-format`` property when using :meth:`~pandas.io.formats.style.Styler.to_excel` (:issue:`22015`)
- :meth:`DataFrame.corr` and :meth:`Series.corr` now raise a ``ValueError`` along with a helpful error message instead of a ``KeyError`` when supplied with an invalid method (:issue:`22298`)
- :meth:`shift` will now always return a copy, instead of the previous behaviour of returning self when shifting by 0 (:issue:`22397`)

.. _whatsnew_0240.deprecations:

Expand Down
2 changes: 1 addition & 1 deletion pandas/core/arrays/datetimelike.py
Expand Up @@ -548,7 +548,7 @@ def shift(self, n, freq=None):

if n == 0:
# immutable so OK
return self
return self.copy()

if self.freq is None:
raise NullFrequencyError("Cannot shift with no freq")
Expand Down
2 changes: 1 addition & 1 deletion pandas/core/generic.py
Expand Up @@ -8282,7 +8282,7 @@ def mask(self, cond, other=np.nan, inplace=False, axis=None, level=None,
@Appender(_shared_docs['shift'] % _shared_doc_kwargs)
def shift(self, periods=1, freq=None, axis=0):
if periods == 0:
return self
return self.copy()

block_axis = self._get_block_manager_axis(axis)
if freq is None:
Expand Down
19 changes: 19 additions & 0 deletions pandas/tests/generic/test_series.py
Expand Up @@ -227,3 +227,22 @@ def test_valid_deprecated(self):
# GH18800
with tm.assert_produces_warning(FutureWarning):
pd.Series([]).valid()

@pytest.mark.parametrize("s", [
Series([np.arange(5)]),
pd.date_range('1/1/2011', periods=24, freq='H'),
pd.Series(range(5), index=pd.date_range("2017", periods=5))
])
@pytest.mark.parametrize("shift_size", [0, 1, 2])
def test_shift_always_copy(self, s, shift_size):
# GH22397
assert s.shift(shift_size) is not s

@pytest.mark.parametrize("move_by_freq", [
pd.Timedelta('1D'),
pd.Timedelta('1M'),
])
def test_datetime_shift_always_copy(self, move_by_freq):
# GH22397
s = pd.Series(range(5), index=pd.date_range("2017", periods=5))
assert s.shift(freq=move_by_freq) is not s

0 comments on commit 0eeceeb

Please sign in to comment.