Skip to content

Commit db27c36

Browse files
authored
CI: Fix pyarrow nightly build (#54110)
* CI: Debug npdev build * Fix date type with to_numpy, test passing in 13 * Fix repr test * address unsafe casting
1 parent 747afca commit db27c36

File tree

6 files changed

+33
-14
lines changed

6 files changed

+33
-14
lines changed

.github/actions/build_pandas/action.yml

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ runs:
1212
run: |
1313
micromamba info
1414
micromamba list
15+
pip list --pre
1516
shell: bash -el {0}
1617

1718
- name: Uninstall existing Pandas installation

pandas/compat/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
pa_version_under8p0,
2929
pa_version_under9p0,
3030
pa_version_under11p0,
31+
pa_version_under13p0,
3132
)
3233

3334
if TYPE_CHECKING:
@@ -183,6 +184,7 @@ def get_bz2_file() -> type[pandas.compat.compressors.BZ2File]:
183184
"pa_version_under8p0",
184185
"pa_version_under9p0",
185186
"pa_version_under11p0",
187+
"pa_version_under13p0",
186188
"IS64",
187189
"ISMUSL",
188190
"PY310",

pandas/compat/pyarrow.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
try:
88
import pyarrow as pa
99

10-
_pa_version = pa.__version__
11-
_palv = Version(_pa_version)
10+
_palv = Version(Version(pa.__version__).base_version)
1211
pa_version_under7p0 = _palv < Version("7.0.0")
1312
pa_version_under8p0 = _palv < Version("8.0.0")
1413
pa_version_under9p0 = _palv < Version("9.0.0")
1514
pa_version_under10p0 = _palv < Version("10.0.0")
1615
pa_version_under11p0 = _palv < Version("11.0.0")
16+
pa_version_under13p0 = _palv < Version("13.0.0")
1717
except ImportError:
1818
pa_version_under7p0 = True
1919
pa_version_under8p0 = True
2020
pa_version_under9p0 = True
2121
pa_version_under10p0 = True
2222
pa_version_under11p0 = True
23+
pa_version_under13p0 = True

pandas/core/arrays/arrow/array.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
pa_version_under8p0,
2525
pa_version_under9p0,
2626
pa_version_under11p0,
27+
pa_version_under13p0,
2728
)
2829
from pandas.util._decorators import doc
2930
from pandas.util._validators import validate_fillna_kwargs
@@ -1218,7 +1219,7 @@ def to_numpy(
12181219
else:
12191220
result = result.to_numpy(dtype=dtype)
12201221
return result
1221-
elif pa.types.is_time(pa_type):
1222+
elif pa.types.is_time(pa_type) or pa.types.is_date(pa_type):
12221223
# convert to list of python datetime.time objects before
12231224
# wrapping in ndarray
12241225
result = np.array(list(self), dtype=dtype)
@@ -1416,6 +1417,8 @@ def _reduce_pyarrow(self, name: str, *, skipna: bool = True, **kwargs) -> pa.Sca
14161417

14171418
data_to_reduce = self._pa_array
14181419

1420+
cast_kwargs = {} if pa_version_under13p0 else {"safe": False}
1421+
14191422
if name in ["any", "all"] and (
14201423
pa.types.is_integer(pa_type)
14211424
or pa.types.is_floating(pa_type)
@@ -1491,9 +1494,15 @@ def pyarrow_meth(data, skip_nulls, **kwargs):
14911494
if name in ["min", "max", "sum"] and pa.types.is_duration(pa_type):
14921495
result = result.cast(pa_type)
14931496
if name in ["median", "mean"] and pa.types.is_temporal(pa_type):
1497+
if not pa_version_under13p0:
1498+
nbits = pa_type.bit_width
1499+
if nbits == 32:
1500+
result = result.cast(pa.int32(), **cast_kwargs)
1501+
else:
1502+
result = result.cast(pa.int64(), **cast_kwargs)
14941503
result = result.cast(pa_type)
14951504
if name in ["std", "sem"] and pa.types.is_temporal(pa_type):
1496-
result = result.cast(pa.int64())
1505+
result = result.cast(pa.int64(), **cast_kwargs)
14971506
if pa.types.is_duration(pa_type):
14981507
result = result.cast(pa_type)
14991508
elif pa.types.is_time(pa_type):

pandas/tests/extension/test_arrow.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1706,7 +1706,11 @@ def test_to_numpy_with_defaults(data):
17061706
result = data.to_numpy()
17071707

17081708
pa_type = data._pa_array.type
1709-
if pa.types.is_duration(pa_type) or pa.types.is_timestamp(pa_type):
1709+
if (
1710+
pa.types.is_duration(pa_type)
1711+
or pa.types.is_timestamp(pa_type)
1712+
or pa.types.is_date(pa_type)
1713+
):
17101714
expected = np.array(list(data))
17111715
else:
17121716
expected = np.array(data._pa_array)
@@ -2969,7 +2973,7 @@ def test_date32_repr():
29692973
# GH48238
29702974
arrow_dt = pa.array([date.fromisoformat("2020-01-01")], type=pa.date32())
29712975
ser = pd.Series(arrow_dt, dtype=ArrowDtype(arrow_dt.type))
2972-
assert repr(ser) == "0 2020-01-01\ndtype: date32[day][pyarrow]"
2976+
assert repr(ser) == "0 2020-01-01\ndtype: date32[day][pyarrow]"
29732977

29742978

29752979
@pytest.mark.xfail(

pandas/tests/io/test_parquet.py

+10-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from pandas.compat.pyarrow import (
1818
pa_version_under7p0,
1919
pa_version_under8p0,
20+
pa_version_under13p0,
2021
)
2122
import pandas.util._test_decorators as td
2223

@@ -1006,14 +1007,15 @@ def test_read_dtype_backend_pyarrow_config(self, pa, df_full):
10061007

10071008
pa_table = pyarrow.Table.from_pandas(df)
10081009
expected = pa_table.to_pandas(types_mapper=pd.ArrowDtype)
1009-
# pyarrow infers datetimes as us instead of ns
1010-
expected["datetime"] = expected["datetime"].astype("timestamp[us][pyarrow]")
1011-
expected["datetime_with_nat"] = expected["datetime_with_nat"].astype(
1012-
"timestamp[us][pyarrow]"
1013-
)
1014-
expected["datetime_tz"] = expected["datetime_tz"].astype(
1015-
pd.ArrowDtype(pyarrow.timestamp(unit="us", tz="Europe/Brussels"))
1016-
)
1010+
if pa_version_under13p0:
1011+
# pyarrow infers datetimes as us instead of ns
1012+
expected["datetime"] = expected["datetime"].astype("timestamp[us][pyarrow]")
1013+
expected["datetime_with_nat"] = expected["datetime_with_nat"].astype(
1014+
"timestamp[us][pyarrow]"
1015+
)
1016+
expected["datetime_tz"] = expected["datetime_tz"].astype(
1017+
pd.ArrowDtype(pyarrow.timestamp(unit="us", tz="Europe/Brussels"))
1018+
)
10171019

10181020
check_round_trip(
10191021
df,

0 commit comments

Comments
 (0)