Skip to content

Commit 010741f

Browse files
committed
BUG: Fixed ValueError raised by cummin/cummax when datetime64 Series contains NaT. (:issue:8965)
1 parent dd670e1 commit 010741f

File tree

3 files changed

+66
-5
lines changed

3 files changed

+66
-5
lines changed

doc/source/whatsnew/v0.15.2.txt

+1
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,4 @@ Bug Fixes
166166
not lexically sorted or unique (:issue:`7724`)
167167
- BUG CSV: fix problem with trailing whitespace in skipped rows, (:issue:`8679`), (:issue:`8661`)
168168
- Regression in ``Timestamp`` does not parse 'Z' zone designator for UTC (:issue:`8771`)
169+
- Fixed ValueError raised by cummin/cummax when datetime64 Series contains NaT. (:issue:`8965`)

pandas/core/generic.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -4112,13 +4112,17 @@ def func(self, axis=None, dtype=None, out=None, skipna=True,
41124112
axis = self._get_axis_number(axis)
41134113

41144114
y = _values_from_object(self).copy()
4115-
if not issubclass(y.dtype.type, (np.integer, np.bool_)):
4115+
4116+
if skipna and issubclass(y.dtype.type,
4117+
(np.datetime64, np.timedelta64)):
4118+
result = accum_func(y, axis)
4119+
mask = isnull(self)
4120+
np.putmask(result, mask, pd.tslib.iNaT)
4121+
elif skipna and not issubclass(y.dtype.type, (np.integer, np.bool_)):
41164122
mask = isnull(self)
4117-
if skipna:
4118-
np.putmask(y, mask, mask_a)
4123+
np.putmask(y, mask, mask_a)
41194124
result = accum_func(y, axis)
4120-
if skipna:
4121-
np.putmask(result, mask, mask_b)
4125+
np.putmask(result, mask, mask_b)
41224126
else:
41234127
result = accum_func(y, axis)
41244128

pandas/tests/test_series.py

+56
Original file line numberDiff line numberDiff line change
@@ -2309,6 +2309,62 @@ def test_cummax(self):
23092309

23102310
self.assert_numpy_array_equal(result, expected)
23112311

2312+
def test_cummin_datetime64(self):
2313+
s = pd.Series(pd.to_datetime(
2314+
['NaT', '2000-1-2', 'NaT', '2000-1-1', 'NaT', '2000-1-3']))
2315+
2316+
expected = pd.Series(pd.to_datetime(
2317+
['NaT', '2000-1-2', 'NaT', '2000-1-1', 'NaT', '2000-1-1']))
2318+
result = s.cummin(skipna=True)
2319+
self.assert_series_equal(expected, result)
2320+
2321+
expected = pd.Series(pd.to_datetime(
2322+
['NaT', '2000-1-2', '2000-1-2', '2000-1-1', '2000-1-1', '2000-1-1']))
2323+
result = s.cummin(skipna=False)
2324+
self.assert_series_equal(expected, result)
2325+
2326+
def test_cummax_datetime64(self):
2327+
s = pd.Series(pd.to_datetime(
2328+
['NaT', '2000-1-2', 'NaT', '2000-1-1', 'NaT', '2000-1-3']))
2329+
2330+
expected = pd.Series(pd.to_datetime(
2331+
['NaT', '2000-1-2', 'NaT', '2000-1-2', 'NaT', '2000-1-3']))
2332+
result = s.cummax(skipna=True)
2333+
self.assert_series_equal(expected, result)
2334+
2335+
expected = pd.Series(pd.to_datetime(
2336+
['NaT', '2000-1-2', '2000-1-2', '2000-1-2', '2000-1-2', '2000-1-3']))
2337+
result = s.cummax(skipna=False)
2338+
self.assert_series_equal(expected, result)
2339+
2340+
def test_cummin_timedelta64(self):
2341+
s = pd.Series(pd.to_timedelta(
2342+
['NaT', '2 min', 'NaT', '1 min', 'NaT', '3 min', ]))
2343+
2344+
expected = pd.Series(pd.to_timedelta(
2345+
['NaT', '2 min', 'NaT', '1 min', 'NaT', '1 min', ]))
2346+
result = s.cummin(skipna=True)
2347+
self.assert_series_equal(expected, result)
2348+
2349+
expected = pd.Series(pd.to_timedelta(
2350+
['NaT', '2 min', '2 min', '1 min', '1 min', '1 min', ]))
2351+
result = s.cummin(skipna=False)
2352+
self.assert_series_equal(expected, result)
2353+
2354+
def test_cummax_timedelta64(self):
2355+
s = pd.Series(pd.to_timedelta(
2356+
['NaT', '2 min', 'NaT', '1 min', 'NaT', '3 min', ]))
2357+
2358+
expected = pd.Series(pd.to_timedelta(
2359+
['NaT', '2 min', 'NaT', '2 min', 'NaT', '3 min', ]))
2360+
result = s.cummax(skipna=True)
2361+
self.assert_series_equal(expected, result)
2362+
2363+
expected = pd.Series(pd.to_timedelta(
2364+
['NaT', '2 min', '2 min', '2 min', '2 min', '3 min', ]))
2365+
result = s.cummax(skipna=False)
2366+
self.assert_series_equal(expected, result)
2367+
23122368
def test_npdiff(self):
23132369
raise nose.SkipTest("skipping due to Series no longer being an "
23142370
"ndarray")

0 commit comments

Comments
 (0)