Skip to content

Commit f09d514

Browse files
authored
REF: remove infer_datetimelike_array (#49608)
1 parent f2f4d12 commit f09d514

File tree

4 files changed

+1
-170
lines changed

4 files changed

+1
-170
lines changed

pandas/_libs/lib.pyi

-3
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,6 @@ def ensure_string_array(
169169
copy: bool = ...,
170170
skipna: bool = ...,
171171
) -> npt.NDArray[np.object_]: ...
172-
def infer_datetimelike_array(
173-
arr: npt.NDArray[np.object_],
174-
) -> str: ...
175172
def convert_nans_to_NA(
176173
arr: npt.NDArray[np.object_],
177174
) -> npt.NDArray[np.object_]: ...

pandas/_libs/lib.pyx

-93
Original file line numberDiff line numberDiff line change
@@ -1565,99 +1565,6 @@ def infer_dtype(value: object, skipna: bool = True) -> str:
15651565
return "mixed"
15661566

15671567

1568-
def infer_datetimelike_array(arr: ndarray[object]) -> tuple[str, bool]:
1569-
"""
1570-
Infer if we have a datetime or timedelta array.
1571-
- date: we have *only* date and maybe strings, nulls
1572-
- datetime: we have *only* datetimes and maybe strings, nulls
1573-
- timedelta: we have *only* timedeltas and maybe strings, nulls
1574-
- nat: we do not have *any* date, datetimes or timedeltas, but do have
1575-
at least a NaT
1576-
- mixed: other objects (strings, a mix of tz-aware and tz-naive, or
1577-
actual objects)
1578-
1579-
Parameters
1580-
----------
1581-
arr : ndarray[object]
1582-
1583-
Returns
1584-
-------
1585-
str: {datetime, timedelta, date, nat, mixed}
1586-
"""
1587-
cdef:
1588-
Py_ssize_t i, n = len(arr)
1589-
bint seen_timedelta = False, seen_date = False, seen_datetime = False
1590-
bint seen_tz_aware = False, seen_tz_naive = False
1591-
bint seen_nat = False
1592-
bint seen_period = False, seen_interval = False
1593-
object v
1594-
1595-
for i in range(n):
1596-
v = arr[i]
1597-
if isinstance(v, str):
1598-
return "mixed"
1599-
1600-
elif v is None or util.is_nan(v):
1601-
# nan or None
1602-
pass
1603-
elif v is NaT:
1604-
seen_nat = True
1605-
elif PyDateTime_Check(v):
1606-
# datetime
1607-
seen_datetime = True
1608-
1609-
# disambiguate between tz-naive and tz-aware
1610-
if v.tzinfo is None:
1611-
seen_tz_naive = True
1612-
else:
1613-
seen_tz_aware = True
1614-
1615-
if seen_tz_naive and seen_tz_aware:
1616-
return "mixed"
1617-
elif util.is_datetime64_object(v):
1618-
# np.datetime64
1619-
seen_datetime = True
1620-
elif PyDate_Check(v):
1621-
seen_date = True
1622-
elif is_timedelta(v):
1623-
# timedelta, or timedelta64
1624-
seen_timedelta = True
1625-
elif is_period_object(v):
1626-
seen_period = True
1627-
break
1628-
elif is_interval(v):
1629-
seen_interval = True
1630-
break
1631-
else:
1632-
return "mixed"
1633-
1634-
if seen_period:
1635-
if is_period_array(arr):
1636-
return "period"
1637-
return "mixed"
1638-
1639-
if seen_interval:
1640-
if is_interval_array(arr):
1641-
return "interval"
1642-
return "mixed"
1643-
1644-
if seen_date:
1645-
if not seen_datetime and not seen_timedelta:
1646-
return "date"
1647-
return "mixed"
1648-
1649-
elif seen_datetime and not seen_timedelta:
1650-
return "datetime"
1651-
elif seen_timedelta and not seen_datetime:
1652-
return "timedelta"
1653-
elif seen_datetime and seen_timedelta:
1654-
return "mixed"
1655-
elif seen_nat:
1656-
return "nat"
1657-
1658-
return "mixed"
1659-
1660-
16611568
cdef inline bint is_timedelta(object o):
16621569
return PyDelta_Check(o) or util.is_timedelta64_object(o)
16631570

pandas/io/parsers/base_parser.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,7 @@ def _infer_types(
771771
result = BooleanArray(result, bool_mask)
772772
elif result.dtype == np.object_ and use_nullable_dtypes:
773773
# read_excel sends array of datetime objects
774-
inferred_type = lib.infer_datetimelike_array(result)
774+
inferred_type = lib.infer_dtype(result)
775775
if inferred_type != "datetime":
776776
result = StringDtype().construct_array_type()._from_sequence(values)
777777

pandas/tests/dtypes/test_inference.py

-73
Original file line numberDiff line numberDiff line change
@@ -1354,79 +1354,6 @@ def test_infer_dtype_period_with_na(self, na_value):
13541354
arr = np.array([na_value, Period("2011-01", freq="D"), na_value])
13551355
assert lib.infer_dtype(arr, skipna=True) == "period"
13561356

1357-
@pytest.mark.parametrize(
1358-
"data",
1359-
[
1360-
[datetime(2017, 6, 12, 19, 30), datetime(2017, 3, 11, 1, 15)],
1361-
[Timestamp("20170612"), Timestamp("20170311")],
1362-
[
1363-
Timestamp("20170612", tz="US/Eastern"),
1364-
Timestamp("20170311", tz="US/Eastern"),
1365-
],
1366-
[np.datetime64("2017-06-12"), np.datetime64("2017-03-11")],
1367-
[np.datetime64("2017-06-12"), datetime(2017, 3, 11, 1, 15)],
1368-
],
1369-
)
1370-
def test_infer_datetimelike_array_datetime(self, data):
1371-
assert lib.infer_datetimelike_array(data) == "datetime"
1372-
1373-
def test_infer_datetimelike_array_date_mixed(self):
1374-
# GH49341 pre-2.0 we these were inferred as "datetime" and "timedelta",
1375-
# respectively
1376-
data = [date(2017, 6, 12), Timestamp("20170311", tz="US/Eastern")]
1377-
assert lib.infer_datetimelike_array(data) == "mixed"
1378-
1379-
data = ([timedelta(2017, 6, 12), date(2017, 3, 11)],)
1380-
assert lib.infer_datetimelike_array(data) == "mixed"
1381-
1382-
@pytest.mark.parametrize(
1383-
"data",
1384-
[
1385-
[timedelta(2017, 6, 12), timedelta(2017, 3, 11)],
1386-
[np.timedelta64(2017, "D"), np.timedelta64(6, "s")],
1387-
[np.timedelta64(2017, "D"), timedelta(2017, 3, 11)],
1388-
],
1389-
)
1390-
def test_infer_datetimelike_array_timedelta(self, data):
1391-
assert lib.infer_datetimelike_array(data) == "timedelta"
1392-
1393-
def test_infer_datetimelike_array_date(self):
1394-
arr = [date(2017, 6, 12), date(2017, 3, 11)]
1395-
assert lib.infer_datetimelike_array(arr) == "date"
1396-
1397-
@pytest.mark.parametrize(
1398-
"data",
1399-
[
1400-
["2017-06-12", "2017-03-11"],
1401-
[20170612, 20170311],
1402-
[20170612.5, 20170311.8],
1403-
[Dummy(), Dummy()],
1404-
[Timestamp("20170612"), Timestamp("20170311", tz="US/Eastern")],
1405-
[Timestamp("20170612"), 20170311],
1406-
[timedelta(2017, 6, 12), Timestamp("20170311", tz="US/Eastern")],
1407-
],
1408-
)
1409-
def test_infer_datetimelike_array_mixed(self, data):
1410-
assert lib.infer_datetimelike_array(data) == "mixed"
1411-
1412-
@pytest.mark.parametrize(
1413-
"first, expected",
1414-
[
1415-
[[None], "mixed"],
1416-
[[np.nan], "mixed"],
1417-
[[pd.NaT], "nat"],
1418-
[[datetime(2017, 6, 12, 19, 30), pd.NaT], "datetime"],
1419-
[[np.datetime64("2017-06-12"), pd.NaT], "datetime"],
1420-
[[date(2017, 6, 12), pd.NaT], "date"],
1421-
[[timedelta(2017, 6, 12), pd.NaT], "timedelta"],
1422-
[[np.timedelta64(2017, "D"), pd.NaT], "timedelta"],
1423-
],
1424-
)
1425-
@pytest.mark.parametrize("second", [None, np.nan])
1426-
def test_infer_datetimelike_array_nan_nat_like(self, first, second, expected):
1427-
first.append(second)
1428-
assert lib.infer_datetimelike_array(first) == expected
1429-
14301357
def test_infer_dtype_all_nan_nat_like(self):
14311358
arr = np.array([np.nan, np.nan])
14321359
assert lib.infer_dtype(arr, skipna=True) == "floating"

0 commit comments

Comments
 (0)