Skip to content

Commit 961a180

Browse files
committed
dtype numpy extension array
1 parent e34886b commit 961a180

File tree

6 files changed

+48
-36
lines changed

6 files changed

+48
-36
lines changed

pandas-stubs/core/construction.pyi

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ from pandas._libs.tslibs.period import Period
4040
from pandas._libs.tslibs.timedeltas import Timedelta
4141
from pandas._libs.tslibs.timestamps import Timestamp
4242
from pandas._typing import (
43-
BuiltinFloatDtypeArg,
44-
BuiltinIntDtypeArg,
45-
BuiltinStrDtypeArg,
43+
BuiltinDtypeArg,
4644
CategoryDtypeArg,
4745
IntervalT,
48-
NumpyDtypeArg,
46+
NumpyNotTimeDtypeArg,
47+
NumpyTimedeltaDtypeArg,
48+
NumpyTimestampDtypeArg,
4949
PandasBooleanDtypeArg,
5050
PandasFloatDtypeArg,
5151
PandasIntDtypeArg,
@@ -119,15 +119,15 @@ def array( # type: ignore[overload-overlap] # pyright: ignore[reportOverlapping
119119
@overload
120120
def array( # type: ignore[overload-overlap]
121121
data: Sequence[int | np.integer | NAType | None] | np_ndarray_anyint | IntegerArray,
122-
dtype: BuiltinIntDtypeArg | PandasIntDtypeArg | PandasUIntDtypeArg | None = None,
122+
dtype: PandasIntDtypeArg | PandasUIntDtypeArg | None = None,
123123
copy: bool = True,
124124
) -> IntegerArray: ...
125125
@overload
126126
def array( # type: ignore[overload-overlap]
127127
data: (
128128
Sequence[float | np.floating | NAType | None] | np_ndarray_float | FloatingArray
129129
),
130-
dtype: BuiltinFloatDtypeArg | PandasFloatDtypeArg | None = None,
130+
dtype: PandasFloatDtypeArg | None = None,
131131
copy: bool = True,
132132
) -> FloatingArray: ...
133133
@overload
@@ -140,7 +140,7 @@ def array( # type: ignore[overload-overlap]
140140
| DatetimeIndex
141141
| Series[Timestamp]
142142
),
143-
dtype: PandasTimestampDtypeArg | None = None,
143+
dtype: PandasTimestampDtypeArg | NumpyTimestampDtypeArg | None = None,
144144
copy: bool = True,
145145
) -> DatetimeArray: ...
146146
@overload
@@ -152,13 +152,13 @@ def array(
152152
| TimedeltaIndex
153153
| Series[Timedelta]
154154
),
155-
dtype: None = None,
155+
dtype: NumpyTimedeltaDtypeArg | None = None,
156156
copy: bool = True,
157157
) -> TimedeltaArray: ...
158158
@overload
159159
def array( # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
160160
data: SequenceNotStr[str | np.str_ | NAType | None] | np_ndarray_str | StringArray,
161-
dtype: BuiltinStrDtypeArg | PandasStrDtypeArg | None = None,
161+
dtype: PandasStrDtypeArg | None = None,
162162
copy: bool = True,
163163
) -> StringArray: ...
164164
@overload
@@ -175,7 +175,7 @@ def array( # type: ignore[overload-overlap]
175175
@overload
176176
def array(
177177
data: SequenceNotStr[object] | np_ndarray | NumpyExtensionArray | RangeIndex,
178-
dtype: NumpyDtypeArg | None = None,
178+
dtype: BuiltinDtypeArg | NumpyNotTimeDtypeArg | None = None,
179179
copy: bool = True,
180180
) -> NumpyExtensionArray: ...
181181
@overload

tests/_typing.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88

99
from pandas._typing import (
1010
BooleanDtypeArg,
11+
BuiltinDtypeArg,
1112
BytesDtypeArg,
1213
CategoryDtypeArg,
1314
ComplexDtypeArg,
1415
FloatDtypeArg,
1516
IntDtypeArg,
17+
NumpyNotTimeDtypeArg,
1618
ObjectDtypeArg,
1719
PandasAstypeComplexDtypeArg,
1820
PandasAstypeFloatDtypeArg,
@@ -62,6 +64,8 @@
6264
"ComplexDtypeArg",
6365
"IntDtypeArg",
6466
"np_ndarray_str",
67+
"BuiltinDtypeArg",
68+
"NumpyNotTimeDtypeArg",
6569
"ObjectDtypeArg",
6670
"PandasAstypeComplexDtypeArg",
6771
"PandasAstypeTimedeltaDtypeArg",

tests/arrays/test_datetime_array.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,8 @@ def test_constructor() -> None:
2424
dt_nat = cast(list[np.datetime64 | NaTType], [np_dt, pd.NaT])
2525
check(assert_type(pd.array(dt_nat), DatetimeArray), DatetimeArray)
2626

27-
check(
28-
assert_type( # type: ignore[assert-type] # I do not understand
29-
pd.array(np.array([dt], np.datetime64)), DatetimeArray
30-
),
31-
DatetimeArray,
32-
)
27+
np_arr = np.array([dt], np.datetime64)
28+
check(assert_type(pd.array(np_arr), DatetimeArray), DatetimeArray)
3329

3430
check(assert_type(pd.array(pd.array([dt])), DatetimeArray), DatetimeArray)
3531

tests/arrays/test_integer_array.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ def test_constructor() -> None:
1212
check(assert_type(pd.array([1, None]), IntegerArray), IntegerArray)
1313
check(assert_type(pd.array([1, pd.NA, None]), IntegerArray), IntegerArray)
1414

15-
check(
16-
assert_type( # type: ignore[assert-type] # I do not understand
17-
pd.array(np.array([1], np.int64)), IntegerArray
18-
),
19-
IntegerArray,
20-
)
15+
np_arr = np.array([1], np.int64)
16+
check(assert_type(pd.array(np_arr), IntegerArray), IntegerArray)
2117

2218
check(assert_type(pd.array(pd.array([1])), IntegerArray), IntegerArray)
Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,31 @@
11
import numpy as np
22
import pandas as pd
33
from pandas.core.arrays.numpy_ import NumpyExtensionArray
4+
import pytest
45
from typing_extensions import assert_type
56

6-
from tests import check
7+
from tests import (
8+
check,
9+
get_dtype,
10+
)
11+
from tests._typing import (
12+
BuiltinDtypeArg,
13+
NumpyNotTimeDtypeArg,
14+
)
715

816

917
def test_constructor() -> None:
1018
# check(
1119
# assert_type(pd.array([pd.NA, None]), NumpyExtensionArray), NumpyExtensionArray
1220
# )
1321

22+
pd_arr = pd.array([1, "🐼"])
23+
check(assert_type(pd_arr, NumpyExtensionArray), NumpyExtensionArray)
24+
25+
np_arr = np.array([1, "🐼"], np.object_)
1426
check(
1527
assert_type( # type: ignore[assert-type] # I do not understand
16-
pd.array([1, "🐼"]), NumpyExtensionArray
17-
),
18-
NumpyExtensionArray,
19-
)
20-
check(
21-
assert_type( # type: ignore[assert-type] # I do not understand
22-
pd.array(np.array([1, "🐼"], np.object_)), NumpyExtensionArray
28+
pd.array(np_arr), NumpyExtensionArray
2329
),
2430
NumpyExtensionArray,
2531
)
@@ -31,3 +37,17 @@ def test_constructor() -> None:
3137
assert_type(pd.array(pd.RangeIndex(0, 1)), NumpyExtensionArray),
3238
NumpyExtensionArray,
3339
)
40+
41+
42+
@pytest.mark.parametrize("dtype", get_dtype(BuiltinDtypeArg | NumpyNotTimeDtypeArg))
43+
def test_constructors_dtype(dtype: BuiltinDtypeArg | NumpyNotTimeDtypeArg):
44+
if dtype == "V" or "void" in str(dtype):
45+
check(
46+
assert_type(pd.array([b"1"], dtype=dtype), NumpyExtensionArray),
47+
NumpyExtensionArray,
48+
)
49+
else:
50+
check(
51+
assert_type(pd.array([1], dtype=dtype), NumpyExtensionArray),
52+
NumpyExtensionArray,
53+
)

tests/arrays/test_timedelta_array.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,8 @@ def test_constructor() -> None:
1919
check(assert_type(pd.array([td, None]), TimedeltaArray), TimedeltaArray)
2020
check(assert_type(pd.array([td, pd.NaT, None]), TimedeltaArray), TimedeltaArray)
2121

22-
check(
23-
assert_type( # type: ignore[assert-type] # I do not understand
24-
pd.array(np.array([td], np.timedelta64)), TimedeltaArray
25-
),
26-
TimedeltaArray,
27-
)
22+
np_arr = np.array([td], np.timedelta64)
23+
check(assert_type(pd.array(np_arr), TimedeltaArray), TimedeltaArray)
2824

2925
check(assert_type(pd.array(pd.array([td])), TimedeltaArray), TimedeltaArray)
3026

0 commit comments

Comments
 (0)