84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
![]() |
import re
|
||
|
|
||
|
import numpy as np
|
||
|
import pytest
|
||
|
|
||
|
from pandas.core.dtypes.common import pandas_dtype
|
||
|
|
||
|
from pandas import Float64Index, Index, Int64Index
|
||
|
import pandas._testing as tm
|
||
|
|
||
|
|
||
|
class TestAstype:
|
||
|
def test_astype_float64_to_object(self):
|
||
|
float_index = Float64Index([0.0, 2.5, 5.0, 7.5, 10.0])
|
||
|
result = float_index.astype(object)
|
||
|
assert result.equals(float_index)
|
||
|
assert float_index.equals(result)
|
||
|
assert isinstance(result, Index) and not isinstance(result, Float64Index)
|
||
|
|
||
|
def test_astype_float64_mixed_to_object(self):
|
||
|
# mixed int-float
|
||
|
idx = Float64Index([1.5, 2, 3, 4, 5])
|
||
|
idx.name = "foo"
|
||
|
result = idx.astype(object)
|
||
|
assert result.equals(idx)
|
||
|
assert idx.equals(result)
|
||
|
assert isinstance(result, Index) and not isinstance(result, Float64Index)
|
||
|
|
||
|
@pytest.mark.parametrize("dtype", ["int16", "int32", "int64"])
|
||
|
def test_astype_float64_to_int_dtype(self, dtype):
|
||
|
# GH#12881
|
||
|
# a float astype int
|
||
|
idx = Float64Index([0, 1, 2])
|
||
|
result = idx.astype(dtype)
|
||
|
expected = Int64Index([0, 1, 2])
|
||
|
tm.assert_index_equal(result, expected)
|
||
|
|
||
|
idx = Float64Index([0, 1.1, 2])
|
||
|
result = idx.astype(dtype)
|
||
|
expected = Int64Index([0, 1, 2])
|
||
|
tm.assert_index_equal(result, expected)
|
||
|
|
||
|
@pytest.mark.parametrize("dtype", ["float32", "float64"])
|
||
|
def test_astype_float64_to_float_dtype(self, dtype):
|
||
|
# GH#12881
|
||
|
# a float astype int
|
||
|
idx = Float64Index([0, 1, 2])
|
||
|
result = idx.astype(dtype)
|
||
|
expected = idx
|
||
|
tm.assert_index_equal(result, expected)
|
||
|
|
||
|
idx = Float64Index([0, 1.1, 2])
|
||
|
result = idx.astype(dtype)
|
||
|
expected = Index(idx.values.astype(dtype))
|
||
|
tm.assert_index_equal(result, expected)
|
||
|
|
||
|
@pytest.mark.parametrize("dtype", ["M8[ns]", "m8[ns]"])
|
||
|
def test_cannot_cast_to_datetimelike(self, dtype):
|
||
|
idx = Float64Index([0, 1.1, 2])
|
||
|
|
||
|
msg = (
|
||
|
f"Cannot convert Float64Index to dtype {pandas_dtype(dtype)}; "
|
||
|
f"integer values are required for conversion"
|
||
|
)
|
||
|
with pytest.raises(TypeError, match=re.escape(msg)):
|
||
|
idx.astype(dtype)
|
||
|
|
||
|
@pytest.mark.parametrize("dtype", [int, "int16", "int32", "int64"])
|
||
|
@pytest.mark.parametrize("non_finite", [np.inf, np.nan])
|
||
|
def test_cannot_cast_inf_to_int(self, non_finite, dtype):
|
||
|
# GH#13149
|
||
|
idx = Float64Index([1, 2, non_finite])
|
||
|
|
||
|
msg = r"Cannot convert non-finite values \(NA or inf\) to integer"
|
||
|
with pytest.raises(ValueError, match=msg):
|
||
|
idx.astype(dtype)
|
||
|
|
||
|
def test_astype_from_object(self):
|
||
|
index = Index([1.0, np.nan, 0.2], dtype="object")
|
||
|
result = index.astype(float)
|
||
|
expected = Float64Index([1.0, np.nan, 0.2])
|
||
|
assert result.dtype == expected.dtype
|
||
|
tm.assert_index_equal(result, expected)
|