diff --git a/pandas-stubs/io/excel/_base.pyi b/pandas-stubs/io/excel/_base.pyi index e370871b4..33ce34814 100644 --- a/pandas-stubs/io/excel/_base.pyi +++ b/pandas-stubs/io/excel/_base.pyi @@ -54,7 +54,7 @@ def read_excel( usecols: str | UsecolsArgType = ..., dtype: str | Dtype | Mapping[str, str | Dtype] | None = ..., engine: ExcelReadEngine | None = ..., - converters: Mapping[int | str, Callable[[object], object]] | None = ..., + converters: Mapping[int | str, Callable[[Any], Any]] | None = ..., true_values: Iterable[Hashable] | None = ..., false_values: Iterable[Hashable] | None = ..., skiprows: int | Sequence[int] | Callable[[object], bool] | None = ..., @@ -97,7 +97,7 @@ def read_excel( usecols: str | UsecolsArgType = ..., dtype: str | Dtype | Mapping[str, str | Dtype] | None = ..., engine: ExcelReadEngine | None = ..., - converters: Mapping[int | str, Callable[[object], object]] | None = ..., + converters: Mapping[int | str, Callable[[Any], Any]] | None = ..., true_values: Iterable[Hashable] | None = ..., false_values: Iterable[Hashable] | None = ..., skiprows: int | Sequence[int] | Callable[[object], bool] | None = ..., @@ -141,7 +141,7 @@ def read_excel( # type: ignore[overload-cannot-match] usecols: str | UsecolsArgType = ..., dtype: str | Dtype | Mapping[str, str | Dtype] | None = ..., engine: ExcelReadEngine | None = ..., - converters: Mapping[int | str, Callable[[object], object]] | None = ..., + converters: Mapping[int | str, Callable[[Any], Any]] | None = ..., true_values: Iterable[Hashable] | None = ..., false_values: Iterable[Hashable] | None = ..., skiprows: int | Sequence[int] | Callable[[object], bool] | None = ..., @@ -184,7 +184,7 @@ def read_excel( usecols: str | UsecolsArgType = ..., dtype: str | Dtype | Mapping[str, str | Dtype] | None = ..., engine: ExcelReadEngine | None = ..., - converters: Mapping[int | str, Callable[[object], object]] | None = ..., + converters: Mapping[int | str, Callable[[Any], Any]] | None = ..., true_values: Iterable[Hashable] | None = ..., false_values: Iterable[Hashable] | None = ..., skiprows: int | Sequence[int] | Callable[[object], bool] | None = ..., @@ -264,7 +264,7 @@ class ExcelFile: names: ListLikeHashable | None = ..., index_col: int | Sequence[int] | None = ..., usecols: str | UsecolsArgType = ..., - converters: dict[int | str, Callable[[object], object]] | None = ..., + converters: dict[int | str, Callable[[Any], Any]] | None = ..., true_values: Iterable[Hashable] | None = ..., false_values: Iterable[Hashable] | None = ..., skiprows: int | Sequence[int] | Callable[[object], bool] | None = ..., @@ -292,7 +292,7 @@ class ExcelFile: names: ListLikeHashable | None = ..., index_col: int | Sequence[int] | None = ..., usecols: str | UsecolsArgType = ..., - converters: dict[int | str, Callable[[object], object]] | None = ..., + converters: dict[int | str, Callable[[Any], Any]] | None = ..., true_values: Iterable[Hashable] | None = ..., false_values: Iterable[Hashable] | None = ..., skiprows: int | Sequence[int] | Callable[[object], bool] | None = ..., diff --git a/tests/test_io.py b/tests/test_io.py index 0d0d27dbd..cc764a3e9 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -14,6 +14,7 @@ ) import numpy as np +from functools import partial import pandas as pd from pandas import ( DataFrame, @@ -304,23 +305,23 @@ def test_sas_bdat() -> None: path = pathlib.Path(CWD, "data", "airline.sas7bdat") check(assert_type(read_sas(path), DataFrame), DataFrame) with check( - assert_type(read_sas(path, iterator=True), Union[SAS7BDATReader, XportReader]), - SAS7BDATReader, + assert_type(read_sas(path, iterator=True), Union[SAS7BDATReader, XportReader]), + SAS7BDATReader, ): pass with check( - assert_type(read_sas(path, iterator=True, format="sas7bdat"), SAS7BDATReader), - SAS7BDATReader, + assert_type(read_sas(path, iterator=True, format="sas7bdat"), SAS7BDATReader), + SAS7BDATReader, ): pass with check( - assert_type(read_sas(path, chunksize=1), Union[SAS7BDATReader, XportReader]), - SAS7BDATReader, + assert_type(read_sas(path, chunksize=1), Union[SAS7BDATReader, XportReader]), + SAS7BDATReader, ): pass with check( - assert_type(read_sas(path, chunksize=1, format="sas7bdat"), SAS7BDATReader), - SAS7BDATReader, + assert_type(read_sas(path, chunksize=1, format="sas7bdat"), SAS7BDATReader), + SAS7BDATReader, ): pass @@ -329,23 +330,23 @@ def test_sas_xport() -> None: path = pathlib.Path(CWD, "data", "SSHSV1_A.xpt") check(assert_type(read_sas(path), DataFrame), DataFrame) with check( - assert_type(read_sas(path, iterator=True), Union[SAS7BDATReader, XportReader]), - XportReader, + assert_type(read_sas(path, iterator=True), Union[SAS7BDATReader, XportReader]), + XportReader, ): pass with check( - assert_type(read_sas(path, iterator=True, format="xport"), XportReader), - XportReader, + assert_type(read_sas(path, iterator=True, format="xport"), XportReader), + XportReader, ): pass with check( - assert_type(read_sas(path, chunksize=1), Union[SAS7BDATReader, XportReader]), - XportReader, + assert_type(read_sas(path, chunksize=1), Union[SAS7BDATReader, XportReader]), + XportReader, ): pass with check( - assert_type(read_sas(path, chunksize=1, format="xport"), XportReader), - XportReader, + assert_type(read_sas(path, chunksize=1, format="xport"), XportReader), + XportReader, ): pass @@ -1149,9 +1150,9 @@ def test_excel_reader(): check(assert_type(pd.read_excel(ef), pd.DataFrame), pd.DataFrame) with pd.ExcelFile( - path_or_buffer=path, - engine="openpyxl", - engine_kwargs={"data_only": True}, + path_or_buffer=path, + engine="openpyxl", + engine_kwargs={"data_only": True}, ) as ef: check(assert_type(ef, pd.ExcelFile), pd.ExcelFile) check(assert_type(pd.read_excel(ef), pd.DataFrame), pd.DataFrame) @@ -1792,3 +1793,15 @@ def test_read_json_engine() -> None: pd.read_json(dd, lines=False, engine="pyarrow") # type: ignore[call-overload] # pyright: ignore[reportArgumentType, reportCallIssue] pd.read_json(io.StringIO(data), engine="pyarrow") # type: ignore[call-overload] # pyright: ignore[reportArgumentType] pd.read_json(io.StringIO(data), lines=True, engine="pyarrow") # type: ignore[call-overload] # pyright: ignore[reportArgumentType, reportCallIssue] + + +def test_converters_partial() -> None: + df = pd.DataFrame({"field_1": ["2020-01-01", "not a date"]}) + partial_func = partial(pd.to_datetime, errors="coerce") + + with ensure_clean(".xlsx") as path: + check(assert_type(df.to_excel(path, index=False), None), type(None)) + + result = pd.read_excel(path, converters={"field_1": partial_func}) + check(assert_type(result, pd.DataFrame), pd.DataFrame) +