Skip to content

BUG GH23282 calling min on series of NaT returns NaT #23289

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Oct 28, 2018
Prev Previous commit
Next Next commit
use fill_value directly
  • Loading branch information
jreback committed Oct 24, 2018
commit a1bde9c0720146dd5f3ccdddac77c289eaa18fd2
29 changes: 16 additions & 13 deletions pandas/core/nanops.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def _get_values(values, skipna, fill_value=None, fill_value_typ=None,
elif is_float_dtype(dtype):
dtype_max = np.float64

return values, mask, dtype, dtype_max
return values, mask, dtype, dtype_max, fill_value


def _isfinite(values):
Expand All @@ -266,19 +266,20 @@ def _view_if_needed(values):
return values


def _wrap_results(result, dtype):
def _wrap_results(result, dtype, fill_value=None):
""" wrap our results if needed """

if (is_integer(result) and is_datetime_or_timedelta_dtype(dtype)
and result == _int64_max):
result = tslibs.iNaT
if is_datetime64_dtype(dtype):
if not isinstance(result, np.ndarray):
if result == fill_value:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it assumed that fill_value is not NA? If not, this will be wrong, since fill_value will never equal fill_value.

Should we assert that it's not NA?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so this can't be for an i8 type by definition. but yes we can assert it.

result = np.nan
result = tslibs.Timestamp(result)
else:
result = result.view(dtype)
elif is_timedelta64_dtype(dtype):
if not isinstance(result, np.ndarray):
if result == fill_value:
result = np.nan

# raise if we have a timedelta64[ns] which is too large
if np.fabs(result) > _int64_max:
Expand Down Expand Up @@ -451,7 +452,8 @@ def nanmean(values, axis=None, skipna=True, mask=None):
>>> nanops.nanmean(s)
1.5
"""
values, mask, dtype, dtype_max = _get_values(values, skipna, 0, mask=mask)
values, mask, dtype, dtype_max, _ = _get_values(
values, skipna, 0, mask=mask)
dtype_sum = dtype_max
dtype_count = np.float64
if is_integer_dtype(dtype) or is_timedelta64_dtype(dtype):
Expand Down Expand Up @@ -504,7 +506,7 @@ def get_median(x):
return np.nan
return np.nanmedian(x[mask])

values, mask, dtype, dtype_max = _get_values(values, skipna, mask=mask)
values, mask, dtype, dtype_max, _ = _get_values(values, skipna, mask=mask)
if not is_float_dtype(values):
values = values.astype('f8')
values[mask] = np.nan
Expand Down Expand Up @@ -708,7 +710,8 @@ def nansem(values, axis=None, skipna=True, ddof=1, mask=None):
def _nanminmax(meth, fill_value_typ):
@bottleneck_switch()
def reduction(values, axis=None, skipna=True, mask=None):
values, mask, dtype, dtype_max = _get_values(

values, mask, dtype, dtype_max, fill_value = _get_values(
values, skipna, fill_value_typ=fill_value_typ, mask=mask)

if ((axis is not None and values.shape[axis] == 0) or
Expand All @@ -722,7 +725,7 @@ def reduction(values, axis=None, skipna=True, mask=None):
else:
result = getattr(values, meth)(axis)

result = _wrap_results(result, dtype)
result = _wrap_results(result, dtype, fill_value)
return _maybe_null_out(result, axis, mask)

reduction.__name__ = 'nan' + meth
Expand Down Expand Up @@ -756,8 +759,8 @@ def nanargmax(values, axis=None, skipna=True, mask=None):
>>> nanops.nanargmax(s)
4
"""
values, mask, dtype, _ = _get_values(values, skipna, fill_value_typ='-inf',
mask=mask)
values, mask, dtype, _, _ = _get_values(
values, skipna, fill_value_typ='-inf', mask=mask)
result = values.argmax(axis)
result = _maybe_arg_null_out(result, axis, mask, skipna)
return result
Expand Down Expand Up @@ -786,8 +789,8 @@ def nanargmin(values, axis=None, skipna=True, mask=None):
>>> nanops.nanargmin(s)
0
"""
values, mask, dtype, _ = _get_values(values, skipna, fill_value_typ='+inf',
mask=mask)
values, mask, dtype, _, _ = _get_values(
values, skipna, fill_value_typ='+inf', mask=mask)
result = values.argmin(axis)
result = _maybe_arg_null_out(result, axis, mask, skipna)
return result
Expand Down