Skip to content

Commit a99275a

Browse files
committed
move diff into its own function in DatetimeTZBlock
1 parent 39db643 commit a99275a

File tree

3 files changed

+42
-17
lines changed

3 files changed

+42
-17
lines changed

pandas/core/algorithms.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -1501,12 +1501,7 @@ def diff(arr, n, axis=0):
15011501
is_timedelta = False
15021502
if needs_i8_conversion(arr):
15031503
dtype = np.float64
1504-
if is_datetime64tz_dtype(arr):
1505-
# Block data is usually a 2D array
1506-
# except DatetimeTZBlock which is a 1D array (DatetimeIndex)
1507-
arr = arr.view('i8').reshape(1, arr.shape[0])
1508-
else:
1509-
arr = arr.view('i8')
1504+
arr = arr.view('i8')
15101505
na = iNaT
15111506
is_timedelta = True
15121507

pandas/core/internals.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -1269,11 +1269,6 @@ def take_nd(self, indexer, axis, new_mgr_locs=None, fill_tuple=None):
12691269

12701270
def diff(self, n, axis=1, mgr=None):
12711271
""" return block for the diff of the values """
1272-
if isinstance(self, DatetimeTZBlock) and axis == 0:
1273-
# This method will iterate (self.apply) over each DateTimeTZBlock
1274-
# but axis=0 will need to gather data from all DateTimeTZBlocks
1275-
# in the manager in order for diff to work correctly.
1276-
raise NotImplementedError
12771272
new_values = algos.diff(self.values, n, axis=axis)
12781273
return [self.make_block(values=new_values)]
12791274

@@ -2857,7 +2852,8 @@ def shift(self, periods, axis=0, mgr=None):
28572852

28582853
# think about moving this to the DatetimeIndex. This is a non-freq
28592854
# (number of periods) shift ###
2860-
2855+
if axis == 0:
2856+
raise NotImplementedError
28612857
N = len(self)
28622858
indexer = np.zeros(N, dtype=int)
28632859
if periods > 0:
@@ -2876,6 +2872,11 @@ def shift(self, periods, axis=0, mgr=None):
28762872
return [self.make_block_same_class(new_values,
28772873
placement=self.mgr_locs)]
28782874

2875+
def diff(self, n, axis=0, mgr=None):
2876+
"""1st discrete difference"""
2877+
new_values = self.values - self.shift(n, axis=axis)[0].values
2878+
return [TimeDeltaBlock(new_values, placement=self.mgr_locs)]
2879+
28792880
def concat_same_type(self, to_concat, placement=None):
28802881
"""
28812882
Concatenate list of single blocks of the same type.

pandas/tests/frame/test_timeseries.py

+34-5
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,26 @@ def test_diff(self):
5959

6060
@pytest.mark.parametrize('axis', [0, 1])
6161
@pytest.mark.parametrize('tz', [None, 'UTC'])
62-
@pytest.mark.xfail(raises=NotImplementedError)
6362
def test_diff_datetime(self, axis, tz):
6463
# GH 18578
6564
df = DataFrame({0: date_range('2010', freq='D', periods=2, tz=tz),
6665
1: date_range('2010', freq='D', periods=2, tz=tz)})
67-
result = df.diff(axis=axis) # xfails for axis=1 and tz='UTC'
6866
if axis == 1:
69-
expected = DataFrame({0: pd.TimedeltaIndex(['NaT', 'NaT']),
70-
1: pd.TimedeltaIndex(['0 days', '0 days'])})
67+
if tz is None:
68+
result = df.diff(axis=axis)
69+
expected = DataFrame({0: pd.TimedeltaIndex(['NaT', 'NaT']),
70+
1: pd.TimedeltaIndex(['0 days',
71+
'0 days'])})
72+
assert_frame_equal(result, expected)
73+
else:
74+
with pytest.raises(NotImplementedError):
75+
result = df.diff(axis=axis)
76+
7177
else:
78+
result = df.diff(axis=axis)
7279
expected = DataFrame({0: pd.TimedeltaIndex(['NaT', '1 days']),
7380
1: pd.TimedeltaIndex(['NaT', '1 days'])})
74-
assert_frame_equal(result, expected)
81+
assert_frame_equal(result, expected)
7582

7683
def test_diff_timedelta(self):
7784
# GH 4533
@@ -294,6 +301,28 @@ def test_shift(self):
294301
result = df.shift(1, axis='columns')
295302
assert_frame_equal(result, expected)
296303

304+
@pytest.mark.parametrize('axis', [0, 1])
305+
@pytest.mark.parametrize('tz', [None, 'UTC'])
306+
def test_shift_datetime(self, axis, tz):
307+
# GH 18578
308+
df = DataFrame(date_range('2010', freq='D', periods=2, tz=tz))
309+
df[1] = df[0]
310+
if axis == 1:
311+
if tz is None:
312+
result = df.shift(axis=axis)
313+
expected = DataFrame(DatetimeIndex([pd.NaT] * 2))
314+
expected[1] = df[1]
315+
assert_frame_equal(result, expected)
316+
else:
317+
with pytest.raises(NotImplementedError):
318+
result = df.shift(axis=axis)
319+
320+
else:
321+
result = df.shift(axis=axis)
322+
expected = DataFrame([pd.NaT, Timestamp('2010', tz=tz)])
323+
expected[1] = expected[0]
324+
assert_frame_equal(result, expected)
325+
297326
def test_shift_bool(self):
298327
df = DataFrame({'high': [True, False],
299328
'low': [False, False]})

0 commit comments

Comments
 (0)