40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
|
from io import StringIO
|
||
|
|
||
|
import numpy as np
|
||
|
import pytest
|
||
|
|
||
|
import pandas as pd
|
||
|
import pandas._testing as tm
|
||
|
from pandas.core.arrays import ExtensionArray
|
||
|
|
||
|
|
||
|
class BaseParsingTests:
|
||
|
@pytest.mark.parametrize("engine", ["c", "python"])
|
||
|
def test_EA_types(self, engine, data, request):
|
||
|
if isinstance(data.dtype, pd.CategoricalDtype):
|
||
|
# in parsers.pyx _convert_with_dtype there is special-casing for
|
||
|
# Categorical that pre-empts _from_sequence_of_strings
|
||
|
pass
|
||
|
elif isinstance(data.dtype, pd.core.dtypes.dtypes.NumpyEADtype):
|
||
|
# These get unwrapped internally so are treated as numpy dtypes
|
||
|
# in the parsers.pyx code
|
||
|
pass
|
||
|
elif (
|
||
|
type(data)._from_sequence_of_strings.__func__
|
||
|
is ExtensionArray._from_sequence_of_strings.__func__
|
||
|
):
|
||
|
# i.e. the EA hasn't overridden _from_sequence_of_strings
|
||
|
mark = pytest.mark.xfail(
|
||
|
reason="_from_sequence_of_strings not implemented",
|
||
|
raises=NotImplementedError,
|
||
|
)
|
||
|
request.node.add_marker(mark)
|
||
|
|
||
|
df = pd.DataFrame({"with_dtype": pd.Series(data, dtype=str(data.dtype))})
|
||
|
csv_output = df.to_csv(index=False, na_rep=np.nan)
|
||
|
result = pd.read_csv(
|
||
|
StringIO(csv_output), dtype={"with_dtype": str(data.dtype)}, engine=engine
|
||
|
)
|
||
|
expected = df
|
||
|
tm.assert_frame_equal(result, expected)
|