Skip to content

Commit 7e13b19

Browse files
authored
TYP: core.missing; PERF for needs_i8_conversion (#36485)
1 parent d38dc06 commit 7e13b19

File tree

3 files changed

+21
-28
lines changed

3 files changed

+21
-28
lines changed

pandas/core/arrays/datetimelike.py

+2-12
Original file line numberDiff line numberDiff line change
@@ -1005,19 +1005,9 @@ def fillna(self, value=None, method=None, limit=None):
10051005
else:
10061006
func = missing.backfill_1d
10071007

1008-
values = self._ndarray
1009-
if not is_period_dtype(self.dtype):
1010-
# For PeriodArray self._ndarray is i8, which gets copied
1011-
# by `func`. Otherwise we need to make a copy manually
1012-
# to avoid modifying `self` in-place.
1013-
values = values.copy()
1014-
1008+
values = self.copy()
10151009
new_values = func(values, limit=limit, mask=mask)
1016-
if is_datetime64tz_dtype(self.dtype):
1017-
# we need to pass int64 values to the constructor to avoid
1018-
# re-localizing incorrectly
1019-
new_values = new_values.view("i8")
1020-
new_values = type(self)(new_values, dtype=self.dtype)
1010+
new_values = self._from_backing_data(new_values)
10211011
else:
10221012
# fill with value
10231013
new_values = self.copy()

pandas/core/dtypes/common.py

+4
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,10 @@ def needs_i8_conversion(arr_or_dtype) -> bool:
12151215
"""
12161216
if arr_or_dtype is None:
12171217
return False
1218+
if isinstance(arr_or_dtype, (np.dtype, ExtensionDtype)):
1219+
# fastpath
1220+
dtype = arr_or_dtype
1221+
return dtype.kind in ["m", "M"] or dtype.type is Period
12181222
return (
12191223
is_datetime_or_timedelta_dtype(arr_or_dtype)
12201224
or is_datetime64tz_dtype(arr_or_dtype)

pandas/core/missing.py

+15-16
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,15 @@
77
import numpy as np
88

99
from pandas._libs import algos, lib
10+
from pandas._typing import DtypeObj
1011
from pandas.compat._optional import import_optional_dependency
1112

1213
from pandas.core.dtypes.cast import infer_dtype_from_array
1314
from pandas.core.dtypes.common import (
1415
ensure_float64,
15-
is_datetime64_dtype,
16-
is_datetime64tz_dtype,
1716
is_integer_dtype,
1817
is_numeric_v_string_like,
1918
is_scalar,
20-
is_timedelta64_dtype,
2119
needs_i8_conversion,
2220
)
2321
from pandas.core.dtypes.missing import isna
@@ -72,7 +70,7 @@ def mask_missing(arr, values_to_mask):
7270
return mask
7371

7472

75-
def clean_fill_method(method, allow_nearest=False):
73+
def clean_fill_method(method, allow_nearest: bool = False):
7674
# asfreq is compat for resampling
7775
if method in [None, "asfreq"]:
7876
return None
@@ -543,7 +541,12 @@ def _cubicspline_interpolate(xi, yi, x, axis=0, bc_type="not-a-knot", extrapolat
543541

544542

545543
def interpolate_2d(
546-
values, method="pad", axis=0, limit=None, fill_value=None, dtype=None
544+
values,
545+
method="pad",
546+
axis=0,
547+
limit=None,
548+
fill_value=None,
549+
dtype: Optional[DtypeObj] = None,
547550
):
548551
"""
549552
Perform an actual interpolation of values, values will be make 2-d if
@@ -584,18 +587,14 @@ def interpolate_2d(
584587
return values
585588

586589

587-
def _cast_values_for_fillna(values, dtype):
590+
def _cast_values_for_fillna(values, dtype: DtypeObj):
588591
"""
589592
Cast values to a dtype that algos.pad and algos.backfill can handle.
590593
"""
591594
# TODO: for int-dtypes we make a copy, but for everything else this
592595
# alters the values in-place. Is this intentional?
593596

594-
if (
595-
is_datetime64_dtype(dtype)
596-
or is_datetime64tz_dtype(dtype)
597-
or is_timedelta64_dtype(dtype)
598-
):
597+
if needs_i8_conversion(dtype):
599598
values = values.view(np.int64)
600599

601600
elif is_integer_dtype(values):
@@ -605,7 +604,7 @@ def _cast_values_for_fillna(values, dtype):
605604
return values
606605

607606

608-
def _fillna_prep(values, mask=None, dtype=None):
607+
def _fillna_prep(values, mask=None, dtype: Optional[DtypeObj] = None):
609608
# boilerplate for pad_1d, backfill_1d, pad_2d, backfill_2d
610609
if dtype is None:
611610
dtype = values.dtype
@@ -620,19 +619,19 @@ def _fillna_prep(values, mask=None, dtype=None):
620619
return values, mask
621620

622621

623-
def pad_1d(values, limit=None, mask=None, dtype=None):
622+
def pad_1d(values, limit=None, mask=None, dtype: Optional[DtypeObj] = None):
624623
values, mask = _fillna_prep(values, mask, dtype)
625624
algos.pad_inplace(values, mask, limit=limit)
626625
return values
627626

628627

629-
def backfill_1d(values, limit=None, mask=None, dtype=None):
628+
def backfill_1d(values, limit=None, mask=None, dtype: Optional[DtypeObj] = None):
630629
values, mask = _fillna_prep(values, mask, dtype)
631630
algos.backfill_inplace(values, mask, limit=limit)
632631
return values
633632

634633

635-
def pad_2d(values, limit=None, mask=None, dtype=None):
634+
def pad_2d(values, limit=None, mask=None, dtype: Optional[DtypeObj] = None):
636635
values, mask = _fillna_prep(values, mask, dtype)
637636

638637
if np.all(values.shape):
@@ -643,7 +642,7 @@ def pad_2d(values, limit=None, mask=None, dtype=None):
643642
return values
644643

645644

646-
def backfill_2d(values, limit=None, mask=None, dtype=None):
645+
def backfill_2d(values, limit=None, mask=None, dtype: Optional[DtypeObj] = None):
647646
values, mask = _fillna_prep(values, mask, dtype)
648647

649648
if np.all(values.shape):

0 commit comments

Comments
 (0)