Skip to content

Commit 7afbdf1

Browse files
authored
BUG: .max() gives wrong answer for non-nanosecond datetimeindex (#50719)
* fix max non-nano * match dtype in NaT case too * check unit in test Co-authored-by: MarcoGorelli <>
1 parent 01141ab commit 7afbdf1

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

pandas/core/nanops.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -370,9 +370,9 @@ def _wrap_results(result, dtype: np.dtype, fill_value=None):
370370
result = np.nan
371371

372372
if isna(result):
373-
result = np.datetime64("NaT", "ns")
373+
result = np.datetime64("NaT", "ns").astype(dtype)
374374
else:
375-
result = np.int64(result).view("datetime64[ns]")
375+
result = np.int64(result).view(dtype)
376376
# retain original unit
377377
result = result.astype(dtype, copy=False)
378378
else:

pandas/tests/arrays/datetimes/test_reductions.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010

1111

1212
class TestReductions:
13+
@pytest.fixture(params=["s", "ms", "us", "ns"])
14+
def unit(self, request):
15+
return request.param
16+
1317
@pytest.fixture
1418
def arr1d(self, tz_naive_fixture):
1519
"""Fixture returning DatetimeArray with parametrized timezones"""
@@ -28,17 +32,20 @@ def arr1d(self, tz_naive_fixture):
2832
)
2933
return arr
3034

31-
def test_min_max(self, arr1d):
35+
def test_min_max(self, arr1d, unit):
3236
arr = arr1d
37+
arr = arr.as_unit(unit)
3338
tz = arr.tz
3439

3540
result = arr.min()
36-
expected = pd.Timestamp("2000-01-02", tz=tz)
41+
expected = pd.Timestamp("2000-01-02", tz=tz).as_unit(unit)
3742
assert result == expected
43+
assert result.unit == expected.unit
3844

3945
result = arr.max()
40-
expected = pd.Timestamp("2000-01-05", tz=tz)
46+
expected = pd.Timestamp("2000-01-05", tz=tz).as_unit(unit)
4147
assert result == expected
48+
assert result.unit == expected.unit
4249

4350
result = arr.min(skipna=False)
4451
assert result is NaT

pandas/tests/test_nanops.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -1157,10 +1157,14 @@ def prng(self):
11571157

11581158

11591159
class TestDatetime64NaNOps:
1160+
@pytest.fixture(params=["s", "ms", "us", "ns"])
1161+
def unit(self, request):
1162+
return request.param
1163+
11601164
# Enabling mean changes the behavior of DataFrame.mean
11611165
# See https://github.com/pandas-dev/pandas/issues/24752
1162-
def test_nanmean(self):
1163-
dti = pd.date_range("2016-01-01", periods=3)
1166+
def test_nanmean(self, unit):
1167+
dti = pd.date_range("2016-01-01", periods=3).as_unit(unit)
11641168
expected = dti[1]
11651169

11661170
for obj in [dti, DatetimeArray(dti), Series(dti)]:
@@ -1173,8 +1177,9 @@ def test_nanmean(self):
11731177
result = nanops.nanmean(obj)
11741178
assert result == expected
11751179

1176-
@pytest.mark.parametrize("dtype", ["M8[ns]", "m8[ns]"])
1177-
def test_nanmean_skipna_false(self, dtype):
1180+
@pytest.mark.parametrize("constructor", ["M8", "m8"])
1181+
def test_nanmean_skipna_false(self, constructor, unit):
1182+
dtype = f"{constructor}[{unit}]"
11781183
arr = np.arange(12).astype(np.int64).view(dtype).reshape(4, 3)
11791184

11801185
arr[-1, -1] = "NaT"

0 commit comments

Comments
 (0)