From a0614f34e5b14f34fa2c9dba5d0049e58b4e9eb6 Mon Sep 17 00:00:00 2001 From: Sachi-Parashar <51981150+Sachi-Parashar@users.noreply.github.com> Date: Tue, 29 Jul 2025 00:36:42 +0530 Subject: [PATCH 1/5] Add files via upload --- pandas-stubs/io/excel/_base.pyi | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 = ..., From ae5365d136e5dbb3a5846dd4a6eed63535afbf81 Mon Sep 17 00:00:00 2001 From: Sachi-Parashar <51981150+Sachi-Parashar@users.noreply.github.com> Date: Tue, 29 Jul 2025 01:03:45 +0530 Subject: [PATCH 2/5] Add files via upload --- tests/test_excel_converters.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 tests/test_excel_converters.py diff --git a/tests/test_excel_converters.py b/tests/test_excel_converters.py new file mode 100644 index 000000000..eb099fa92 --- /dev/null +++ b/tests/test_excel_converters.py @@ -0,0 +1,9 @@ +from functools import partial +import pandas as pd +from typing_extensions import assert_type + +partial_func = partial(pd.to_datetime, errors="coerce") + +df = pd.read_excel("foo.xlsx", converters={"field_1": partial_func}) + +assert_type(df, pd.DataFrame) \ No newline at end of file From 2c1b5df29d8835857feb500d4aea11e8a65b1284 Mon Sep 17 00:00:00 2001 From: Sachi-Parashar <51981150+Sachi-Parashar@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:06:06 +0530 Subject: [PATCH 3/5] Delete tests/test_excel_converters.py Remove redundant test_excel_converters.py after moving test to test_io.py --- tests/test_excel_converters.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 tests/test_excel_converters.py diff --git a/tests/test_excel_converters.py b/tests/test_excel_converters.py deleted file mode 100644 index eb099fa92..000000000 --- a/tests/test_excel_converters.py +++ /dev/null @@ -1,9 +0,0 @@ -from functools import partial -import pandas as pd -from typing_extensions import assert_type - -partial_func = partial(pd.to_datetime, errors="coerce") - -df = pd.read_excel("foo.xlsx", converters={"field_1": partial_func}) - -assert_type(df, pd.DataFrame) \ No newline at end of file From 288c04d2e2793ab0022ef8de866fa02981e6e775 Mon Sep 17 00:00:00 2001 From: Sachi-Parashar <51981150+Sachi-Parashar@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:08:52 +0530 Subject: [PATCH 4/5] Move converter test to test_io.py Add test_converters_partial() to test_io.py for read_excel converters --- tests/test_io.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_io.py b/tests/test_io.py index 0d0d27dbd..4cb94e89d 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -1792,3 +1792,13 @@ 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: + from functools import partial + import pandas as pd + from typing_extensions import assert_type + + partial_func = partial(pd.to_datetime, errors="coerce") + df = pd.read_excel("foo.xlsx", converters={"field_1": partial_func}) + assert_type(df, pd.DataFrame) From 19d18cef0f48869dbf5af1b1a6adc585b7357e95 Mon Sep 17 00:00:00 2001 From: Sachi-Parashar <51981150+Sachi-Parashar@users.noreply.github.com> Date: Thu, 7 Aug 2025 17:51:18 +0530 Subject: [PATCH 5/5] Used ensure_clean() --- tests/test_io.py | 53 +++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/tests/test_io.py b/tests/test_io.py index 4cb94e89d..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) @@ -1795,10 +1796,12 @@ def test_read_json_engine() -> None: def test_converters_partial() -> None: - from functools import partial - import pandas as pd - from typing_extensions import assert_type - + df = pd.DataFrame({"field_1": ["2020-01-01", "not a date"]}) partial_func = partial(pd.to_datetime, errors="coerce") - df = pd.read_excel("foo.xlsx", converters={"field_1": partial_func}) - assert_type(df, pd.DataFrame) + + 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) +