This is an automated email from the ASF dual-hosted git repository.

raulcd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 934fa870a7 GH-50410: [Python][Packaging] Drop Python 3.10 support 
(#50411)
934fa870a7 is described below

commit 934fa870a7b2fbc8ce1fea547528d35f24ad711b
Author: Raúl Cumplido <[email protected]>
AuthorDate: Thu Jul 9 12:33:32 2026 +0200

    GH-50410: [Python][Packaging] Drop Python 3.10 support (#50411)
    
    ### Rationale for this change
    
    Python 3.10 is End of Support on October 2026. We can drop support on 
PyArrow 26.0.0.
    See: https://endoflife.date/python
    
    ### What changes are included in this PR?
    
    Remove support for 3.10. Update minimum required Python version and update 
some CI jobs to use the minimum Python supported version.
    Some CI jobs using default Python 3.10 (Ubuntu 20.04) have been bumped.
    
    ### Are these changes tested?
    
    They will be tested via CI and Archery
    
    ### Are there any user-facing changes?
    
    Yes in terms of not supporting older versions of Python. This will be a 
breaking change for some users but not for the API itself
    
    * GitHub Issue: #50410
    
    Authored-by: Raúl Cumplido <[email protected]>
    Signed-off-by: Raúl Cumplido <[email protected]>
---
 .env                                               |  6 ++--
 .github/workflows/python.yml                       | 42 +++++++++++-----------
 ci/docker/conda-cpp.dockerfile                     |  4 +--
 ci/docker/conda-python-cpython-debug.dockerfile    |  4 +--
 ci/docker/conda-python-dask.dockerfile             |  2 +-
 ci/docker/conda-python-hdfs.dockerfile             |  2 +-
 ci/docker/conda-python-jpype.dockerfile            |  2 +-
 ci/docker/conda-python-pandas.dockerfile           |  2 +-
 ci/docker/conda-python-spark.dockerfile            |  2 +-
 ci/docker/conda-python.dockerfile                  |  2 +-
 ci/docker/cpp-jni.dockerfile                       |  4 +--
 ci/docker/python-wheel-manylinux.dockerfile        |  8 ++---
 ci/docker/python-wheel-musllinux-test.dockerfile   | 13 +------
 ci/docker/python-wheel-musllinux.dockerfile        |  8 ++---
 .../python-wheel-windows-test-vs2022.dockerfile    | 11 +++---
 ci/docker/python-wheel-windows-vs2022.dockerfile   |  3 +-
 ci/scripts/install_python.sh                       |  9 +++--
 ci/scripts/r_install_system_dependencies.sh        |  8 ++---
 compose.yaml                                       |  2 +-
 dev/archery/setup.py                               |  6 ++--
 dev/release/verify-release-candidate-wheels.bat    |  6 ++--
 dev/release/verify-release-candidate.bat           |  2 +-
 dev/release/verify-release-candidate.sh            |  6 ++--
 dev/tasks/python-sdist/github.yml                  |  2 +-
 dev/tasks/python-wheels/github.linux.yml           |  2 +-
 dev/tasks/tasks.yml                                | 29 ++++++---------
 .../developers/continuous_integration/archery.rst  |  2 +-
 .../developers/continuous_integration/crossbow.rst |  2 +-
 docs/source/python/install.rst                     |  6 ++--
 python/examples/minimal_build/build_conda.sh       |  2 +-
 python/pyproject.toml                              |  5 ++-
 r/tests/testthat/test-python.R                     |  4 +--
 32 files changed, 91 insertions(+), 117 deletions(-)

diff --git a/.env b/.env
index 980dc243b8..44b9db8aef 100644
--- a/.env
+++ b/.env
@@ -72,9 +72,9 @@ NUMBA=latest
 NUMBA_CUDA=latest
 NUMPY=latest
 PANDAS=latest
-PYTHON=3.10
-PYTHON_IMAGE_TAG=3.10
-PYTHON_ABI_TAG=cp310
+PYTHON=3.11
+PYTHON_IMAGE_TAG=3.11
+PYTHON_ABI_TAG=cp311
 R=4.5
 SPARK=master
 
diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml
index a86db37c93..30e6272fb3 100644
--- a/.github/workflows/python.yml
+++ b/.github/workflows/python.yml
@@ -66,36 +66,36 @@ jobs:
       matrix:
         name:
           - conda-python-docs
-          - conda-python-3.11-nopandas
-          - conda-python-3.10-pandas-1.3.4
-          - conda-python-3.13-pandas-latest
-          - conda-python-3.12-no-numpy
+          - conda-python-3.12-nopandas
+          - conda-python-3.11-pandas-1.5.2
+          - conda-python-3.14-pandas-latest
+          - conda-python-3.13-no-numpy
         include:
           - name: conda-python-docs
             image: conda-python-docs
-            title: AMD64 Conda Python 3.11 Sphinx & Numpydoc
-            python: "3.11"
-          - name: conda-python-3.11-nopandas
+            title: AMD64 Conda Python 3.12 Sphinx & Numpydoc
+            python: "3.12"
+          - name: conda-python-3.12-nopandas
             image: conda-python
-            title: AMD64 Conda Python 3.11 Without Pandas
-            python: "3.11"
-          - name: conda-python-3.10-pandas-1.3.4
+            title: AMD64 Conda Python 3.12 Without Pandas
+            python: "3.12"
+          - name: conda-python-3.11-pandas-1.5.2
             image: conda-python-pandas
-            title: AMD64 Conda Python 3.10 Pandas 1.3.4
-            python: "3.10"
-            pandas: "1.3.4"
-            numpy: "1.21.2"
-          - name: conda-python-3.13-pandas-latest
+            title: AMD64 Conda Python 3.11 Pandas 1.5.2
+            python: "3.11"
+            pandas: "1.5.2"
+            numpy: "1.23.2"
+          - name: conda-python-3.14-pandas-latest
             image: conda-python-pandas
-            title: AMD64 Conda Python 3.13 Pandas latest
-            python: "3.13"
+            title: AMD64 Conda Python 3.14 Pandas latest
+            python: "3.14"
             pandas: latest
-          - name: conda-python-3.12-no-numpy
+          - name: conda-python-3.13-no-numpy
             image: conda-python-no-numpy
-            title: AMD64 Conda Python 3.12 without NumPy
-            python: "3.12"
+            title: AMD64 Conda Python 3.13 without NumPy
+            python: "3.13"
     env:
-      PYTHON: ${{ matrix.python || 3.10 }}
+      PYTHON: ${{ matrix.python || 3.11 }}
       UBUNTU: ${{ matrix.ubuntu || 22.04 }}
       PANDAS: ${{ matrix.pandas || 'latest' }}
       NUMPY: ${{ matrix.numpy || 'latest' }}
diff --git a/ci/docker/conda-cpp.dockerfile b/ci/docker/conda-cpp.dockerfile
index 474c18a9ad..4340a18f6e 100644
--- a/ci/docker/conda-cpp.dockerfile
+++ b/ci/docker/conda-cpp.dockerfile
@@ -23,9 +23,7 @@ FROM --platform=linux/${arch} ${repo}:${arch_short}-conda
 COPY ci/scripts/install_minio.sh /arrow/ci/scripts
 RUN /arrow/ci/scripts/install_minio.sh latest /opt/conda
 
-# Unless overridden use Python 3.10
-# Google GCS fails building with Python 3.11 at the moment.
-ARG python=3.10
+ARG python=3.11
 
 # install the required conda packages into the test environment
 # use `mold` to work around issues with GNU `ld` (GH-47015).
diff --git a/ci/docker/conda-python-cpython-debug.dockerfile 
b/ci/docker/conda-python-cpython-debug.dockerfile
index daa6c51c6b..d8da1d3a89 100644
--- a/ci/docker/conda-python-cpython-debug.dockerfile
+++ b/ci/docker/conda-python-cpython-debug.dockerfile
@@ -17,11 +17,11 @@
 
 ARG repo
 ARG arch
-ARG python=3.10
+ARG python=3.11
 FROM ${repo}:${arch}-conda-python-${python}
 
 # (Docker oddity: ARG needs to be repeated after FROM)
-ARG python=3.10
+ARG python=3.11
 RUN mamba install -c conda-forge/label/python_debug cpython 
"python=${python}[build=*_debug_*]" && \
     mamba clean --all --yes
 # Quick check that we do have a debug mode CPython
diff --git a/ci/docker/conda-python-dask.dockerfile 
b/ci/docker/conda-python-dask.dockerfile
index 6991f10086..37fca16f21 100644
--- a/ci/docker/conda-python-dask.dockerfile
+++ b/ci/docker/conda-python-dask.dockerfile
@@ -18,7 +18,7 @@
 ARG repo
 ARG arch
 ARG arch_short
-ARG python=3.10
+ARG python=3.11
 FROM --platform=linux/${arch} ${repo}:${arch_short}-conda-python-${python}
 
 ARG dask=latest
diff --git a/ci/docker/conda-python-hdfs.dockerfile 
b/ci/docker/conda-python-hdfs.dockerfile
index 263b38eaa5..85311c8fa1 100644
--- a/ci/docker/conda-python-hdfs.dockerfile
+++ b/ci/docker/conda-python-hdfs.dockerfile
@@ -18,7 +18,7 @@
 ARG repo
 ARG arch
 ARG arch_short
-ARG python=3.10
+ARG python=3.11
 FROM --platform=linux/${arch} ${repo}:${arch_short}-conda-python-${python}
 
 ARG jdk=11
diff --git a/ci/docker/conda-python-jpype.dockerfile 
b/ci/docker/conda-python-jpype.dockerfile
index d5aa747b86..1c5b29856f 100644
--- a/ci/docker/conda-python-jpype.dockerfile
+++ b/ci/docker/conda-python-jpype.dockerfile
@@ -18,7 +18,7 @@
 ARG repo
 ARG arch
 ARG arch_short
-ARG python=3.10
+ARG python=3.11
 FROM --platform=linux/${arch} ${repo}:${arch_short}-conda-python-${python}
 
 ARG jdk=11
diff --git a/ci/docker/conda-python-pandas.dockerfile 
b/ci/docker/conda-python-pandas.dockerfile
index e39650af82..07095377d8 100644
--- a/ci/docker/conda-python-pandas.dockerfile
+++ b/ci/docker/conda-python-pandas.dockerfile
@@ -18,7 +18,7 @@
 ARG repo
 ARG arch
 ARG arch_short
-ARG python=3.10
+ARG python=3.11
 FROM --platform=linux/${arch} ${repo}:${arch_short}-conda-python-${python}
 
 ARG pandas=latest
diff --git a/ci/docker/conda-python-spark.dockerfile 
b/ci/docker/conda-python-spark.dockerfile
index 89bc231aad..d7e74f08ee 100644
--- a/ci/docker/conda-python-spark.dockerfile
+++ b/ci/docker/conda-python-spark.dockerfile
@@ -18,7 +18,7 @@
 ARG repo
 ARG arch
 ARG arch_short
-ARG python=3.10
+ARG python=3.11
 FROM --platform=linux/${arch} ${repo}:${arch_short}-conda-python-${python}
 
 ARG jdk=11
diff --git a/ci/docker/conda-python.dockerfile 
b/ci/docker/conda-python.dockerfile
index db40b1009f..1a438d087f 100644
--- a/ci/docker/conda-python.dockerfile
+++ b/ci/docker/conda-python.dockerfile
@@ -21,7 +21,7 @@ ARG arch_short
 FROM --platform=linux/${arch} ${repo}:${arch_short}-conda-cpp
 
 # install python specific packages
-ARG python=3.10
+ARG python=3.11
 COPY ci/conda_env_python.txt \
      /arrow/ci/
 # If the Python version being tested is the same as the Python used by the 
system gdb,
diff --git a/ci/docker/cpp-jni.dockerfile b/ci/docker/cpp-jni.dockerfile
index 5d1c3c6b45..c3fabd163f 100644
--- a/ci/docker/cpp-jni.dockerfile
+++ b/ci/docker/cpp-jni.dockerfile
@@ -38,9 +38,9 @@ RUN dnf module enable -y llvm-toolset && \
 
 # A system Python is required for Ninja and vcpkg in this Dockerfile.
 # On manylinux_2_28 base images, no system Python is installed.
-# We therefore override the PATH with Python 3.10 in /opt/python
+# We therefore override the PATH with Python 3.11 in /opt/python
 # so that we have a consistent Python version across base images.
-ENV CPYTHON_VERSION=cp310
+ENV CPYTHON_VERSION=cp311
 ENV PATH=/opt/python/${CPYTHON_VERSION}-${CPYTHON_VERSION}/bin:${PATH}
 
 # Install CMake
diff --git a/ci/docker/python-wheel-manylinux.dockerfile 
b/ci/docker/python-wheel-manylinux.dockerfile
index 58e7ea533f..57814b11ec 100644
--- a/ci/docker/python-wheel-manylinux.dockerfile
+++ b/ci/docker/python-wheel-manylinux.dockerfile
@@ -30,9 +30,9 @@ RUN dnf install -y git flex curl autoconf zip perl-IPC-Cmd 
perl-Time-Piece wget
 
 # A system Python is required for Ninja and vcpkg in this Dockerfile.
 # On manylinux_2_28 base images, no system Python is installed.
-# We therefore override the PATH with Python 3.10 in /opt/python
+# We therefore override the PATH with Python 3.11 in /opt/python
 # so that we have a consistent Python version across base images.
-ENV CPYTHON_VERSION=cp310
+ENV CPYTHON_VERSION=cp311
 ENV PATH=/opt/python/${CPYTHON_VERSION}-${CPYTHON_VERSION}/bin:${PATH}
 
 # Install CMake
@@ -109,8 +109,8 @@ RUN --mount=type=secret,id=github_repository_owner \
 RUN pipx upgrade auditwheel>=6.4.0
 
 # Configure Python for applications running in the bash shell of this 
Dockerfile
-ARG python=3.10
-ARG python_abi_tag=cp310
+ARG python=3.11
+ARG python_abi_tag=cp311
 ENV PYTHON_VERSION=${python}
 ENV PYTHON_ABI_TAG=${python_abi_tag}
 RUN PYTHON_ROOT=$(find /opt/python -name 
cp${PYTHON_VERSION/./}-${PYTHON_ABI_TAG}) && \
diff --git a/ci/docker/python-wheel-musllinux-test.dockerfile 
b/ci/docker/python-wheel-musllinux-test.dockerfile
index 03473a9a34..5ee59ef1de 100644
--- a/ci/docker/python-wheel-musllinux-test.dockerfile
+++ b/ci/docker/python-wheel-musllinux-test.dockerfile
@@ -36,18 +36,7 @@ RUN cp /usr/share/zoneinfo/Etc/UTC /etc/localtime
 # pandas doesn't provide wheel for aarch64 yet, so cache the compiled
 # test dependencies in a docker image
 COPY python/requirements-wheel-test.txt /arrow/python/
-# Pandas 2.0.3 is the last version to support numpy 1.21.x which is
-# the lowest version we support for Python 3.10.
-# Pandas 2.0.3 doesn't have wheels for Python 3.10 so we need to build from 
source,
-# which requires setuptools < 80.
-# Drop when bumping numpy from 1.21.x (GH-48473) or when dropping Python 3.10.
-RUN if [ "${python_image_tag}" = "3.10" ]; then \
-        echo 'setuptools<80' > /tmp/setuptools-constraint.txt; \
-        PIP_CONSTRAINT=/tmp/setuptools-constraint.txt \
-            pip install -r /arrow/python/requirements-wheel-test.txt; \
-    else \
-        pip install -r /arrow/python/requirements-wheel-test.txt; \
-    fi
+RUN pip install -r /arrow/python/requirements-wheel-test.txt
 
 # Install the GCS testbench with the system Python
 COPY ci/scripts/install_gcs_testbench.sh /arrow/ci/scripts/
diff --git a/ci/docker/python-wheel-musllinux.dockerfile 
b/ci/docker/python-wheel-musllinux.dockerfile
index 1ddbcfb81e..c931d31944 100644
--- a/ci/docker/python-wheel-musllinux.dockerfile
+++ b/ci/docker/python-wheel-musllinux.dockerfile
@@ -51,10 +51,10 @@ RUN apk add --no-cache mold
 
 # A system Python is required for ninja and vcpkg in this Dockerfile.
 # On musllinux_1_2 a system python is installed (3.12) but pip is not
-# We therefore override the PATH with Python 3.10 in /opt/python
+# We therefore override the PATH with Python 3.11 in /opt/python
 # so that we have a consistent Python version across base images
 # as well as pip.
-ENV CPYTHON_VERSION=cp310
+ENV CPYTHON_VERSION=cp311
 ENV PATH=/opt/python/${CPYTHON_VERSION}-${CPYTHON_VERSION}/bin:${PATH}
 
 # Install vcpkg
@@ -110,8 +110,8 @@ RUN --mount=type=secret,id=github_repository_owner \
 RUN pipx upgrade auditwheel
 
 # Configure Python for applications running in the bash shell of this 
Dockerfile
-ARG python=3.10
-ARG python_abi_tag=cp310
+ARG python=3.11
+ARG python_abi_tag=cp311
 ENV PYTHON_VERSION=${python}
 ENV PYTHON_ABI_TAG=${python_abi_tag}
 RUN PYTHON_ROOT=$(find /opt/python -name 
cp${PYTHON_VERSION/./}-${PYTHON_ABI_TAG}) && \
diff --git a/ci/docker/python-wheel-windows-test-vs2022.dockerfile 
b/ci/docker/python-wheel-windows-test-vs2022.dockerfile
index 73a9e167fe..fcb65ba231 100644
--- a/ci/docker/python-wheel-windows-test-vs2022.dockerfile
+++ b/ci/docker/python-wheel-windows-test-vs2022.dockerfile
@@ -26,13 +26,12 @@ FROM ${base}
 
 # hadolint shell=cmd.exe
 
-# Define the full version number otherwise choco falls back to patch number 0 
(3.10 => 3.10.0)
-ARG python=3.10
-RUN (if "%python%"=="3.10" setx PYTHON_VERSION "3.10.11" && setx PYTHON_CMD 
"py -3.10") & \
-    (if "%python%"=="3.11" setx PYTHON_VERSION "3.11.9" && setx PYTHON_CMD "py 
-3.11") & \
+# Define the full version number otherwise choco falls back to patch number 0 
(3.11 => 3.11.0)
+ARG python=3.11
+RUN (if "%python%"=="3.11" setx PYTHON_VERSION "3.11.9" && setx PYTHON_CMD "py 
-3.11") & \
     (if "%python%"=="3.12" setx PYTHON_VERSION "3.12.10" && setx PYTHON_CMD 
"py -3.12") & \
-    (if "%python%"=="3.13" setx PYTHON_VERSION "3.13.9" && setx PYTHON_CMD "py 
-3.13") & \
-    (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.0" && setx PYTHON_CMD "py 
-3.14")
+    (if "%python%"=="3.13" setx PYTHON_VERSION "3.13.14" && setx PYTHON_CMD 
"py -3.13") & \
+    (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.6" && setx PYTHON_CMD "py 
-3.14")
 
 # hadolint ignore=DL3059
 RUN choco install -r -y --pre --no-progress --force python 
--version=%PYTHON_VERSION%
diff --git a/ci/docker/python-wheel-windows-vs2022.dockerfile 
b/ci/docker/python-wheel-windows-vs2022.dockerfile
index e25ebef156..941083e7ee 100644
--- a/ci/docker/python-wheel-windows-vs2022.dockerfile
+++ b/ci/docker/python-wheel-windows-vs2022.dockerfile
@@ -21,8 +21,7 @@
 ARG base
 FROM ${base}
 
-# Define the full version number otherwise choco falls back to patch number 0 
(3.10 => 3.10.0)
-ARG python=3.10
+ARG python=3.11
 
 ARG python_variant_suffix=""
 ENV PYTHON_VERSION=${python}${python_variant_suffix}
diff --git a/ci/scripts/install_python.sh b/ci/scripts/install_python.sh
index b02a6ce63e..f6502b1be8 100755
--- a/ci/scripts/install_python.sh
+++ b/ci/scripts/install_python.sh
@@ -25,12 +25,11 @@ platforms=([windows]=Windows
            [linux]=Linux)
 
 declare -A versions
-versions=([3.10]=3.10.11
-          [3.11]=3.11.9
+versions=([3.11]=3.11.9
           [3.12]=3.12.10
-          [3.13]=3.13.9
-          [3.14]=3.14.0
-          [3.14t]=3.14.0)
+          [3.13]=3.13.14
+          [3.14]=3.14.6
+          [3.14t]=3.14.6)
 
 if [ "$#" -ne 2 ]; then
   echo "Usage: $0 <platform> <version>"
diff --git a/ci/scripts/r_install_system_dependencies.sh 
b/ci/scripts/r_install_system_dependencies.sh
index 042d6a5c9a..955d1d6d58 100755
--- a/ci/scripts/r_install_system_dependencies.sh
+++ b/ci/scripts/r_install_system_dependencies.sh
@@ -62,10 +62,10 @@ if [ "$ARROW_S3" == "ON" ] || [ "$ARROW_GCS" == "ON" ] || [ 
"$ARROW_R_DEV" == "T
     case "$PACKAGE_MANAGER" in
       zypper)
         # python3 is Python 3.6 on OpenSUSE 15.3.
-        # PyArrow supports Python 3.10 or later.
-        $PACKAGE_MANAGER install -y python310-pip
-        ln -s /usr/bin/python3.10 /usr/local/bin/python
-        ln -s /usr/bin/pip3.10 /usr/local/bin/pip
+        # PyArrow supports Python 3.11 or later.
+        $PACKAGE_MANAGER install -y python311-pip
+        ln -s /usr/bin/python3.11 /usr/local/bin/python
+        ln -s /usr/bin/pip3.11 /usr/local/bin/pip
         ;;
       apk)
         $PACKAGE_MANAGER add py3-pip
diff --git a/compose.yaml b/compose.yaml
index dead873fee..6676a87bd5 100644
--- a/compose.yaml
+++ b/compose.yaml
@@ -939,7 +939,7 @@ services:
     #   docker compose run --rm conda-python
     # Parameters:
     #   ARCH: amd64, arm/v7
-    #   PYTHON: 3.10, 3.11, 3.12, 3.13
+    #   PYTHON: 3.11, 3.12, 3.13, 3.14
     image: ${REPO}:${ARCH_SHORT}-conda-python-${PYTHON}
     build:
       context: .
diff --git a/dev/archery/setup.py b/dev/archery/setup.py
index 47ae2bb26b..66d04d692f 100755
--- a/dev/archery/setup.py
+++ b/dev/archery/setup.py
@@ -21,8 +21,8 @@ import operator
 import sys
 from setuptools import setup, find_packages
 
-if sys.version_info < (3, 10):
-    sys.exit('Python < 3.10 is not supported')
+if sys.version_info < (3, 11):
+    sys.exit('Python < 3.11 is not supported')
 
 # For pathlib.Path compatibility
 jinja_req = 'jinja2>=2.11'
@@ -49,7 +49,7 @@ setup(
     maintainer_email='[email protected]',
     packages=find_packages(),
     include_package_data=True,
-    python_requires='>=3.10',
+    python_requires='>=3.11',
     install_requires=['click>=7'],
     tests_require=['pytest', 'responses'],
     extras_require=extras,
diff --git a/dev/release/verify-release-candidate-wheels.bat 
b/dev/release/verify-release-candidate-wheels.bat
index 431e96f24d..0e98de0073 100644
--- a/dev/release/verify-release-candidate-wheels.bat
+++ b/dev/release/verify-release-candidate-wheels.bat
@@ -46,9 +46,6 @@ python dev\release\download_rc_binaries.py %ARROW_VERSION% 
%RC_NUMBER% ^
 set ARROW_TEST_DATA=%cd%\testing\data
 set PARQUET_TEST_DATA=%cd%\cpp\submodules\parquet-testing\data
 
-CALL :verify_wheel 3.10
-if errorlevel 1 GOTO error
-
 CALL :verify_wheel 3.11
 if errorlevel 1 GOTO error
 
@@ -58,6 +55,9 @@ if errorlevel 1 GOTO error
 CALL :verify_wheel 3.13
 if errorlevel 1 GOTO error
 
+CALL :verify_wheel 3.14
+if errorlevel 1 GOTO error
+
 :done
 cd %_CURRENT_DIR%
 
diff --git a/dev/release/verify-release-candidate.bat 
b/dev/release/verify-release-candidate.bat
index 5d903fdef0..e3e9e800e8 100644
--- a/dev/release/verify-release-candidate.bat
+++ b/dev/release/verify-release-candidate.bat
@@ -56,7 +56,7 @@ if "%VERSION%"=="" (
 
 set ARROW_TEST_DATA=!ARROW_SOURCE!\testing\data
 set PARQUET_TEST_DATA=!ARROW_SOURCE!\cpp\submodules\parquet-testing\data
-set PYTHON=3.10
+set PYTHON=3.11
 
 @rem Using call with conda.bat seems necessary to avoid terminating the batch
 @rem script execution
diff --git a/dev/release/verify-release-candidate.sh 
b/dev/release/verify-release-candidate.sh
index ae49367ba6..a060901ea4 100755
--- a/dev/release/verify-release-candidate.sh
+++ b/dev/release/verify-release-candidate.sh
@@ -859,7 +859,7 @@ test_linux_wheels() {
     local arch="x86_64"
   fi
 
-  local python_versions="${TEST_PYTHON_VERSIONS:-3.10 3.11 3.12 3.13 3.14}"
+  local python_versions="${TEST_PYTHON_VERSIONS:-3.11 3.12 3.13 3.14}"
   local platform_tags="${TEST_WHEEL_PLATFORM_TAGS:-manylinux_2_28_${arch}}"
 
   if [ "${SOURCE_KIND}" != "local" ]; then
@@ -898,11 +898,11 @@ test_macos_wheels() {
 
   # apple silicon processor
   if [ "$(uname -m)" = "arm64" ]; then
-    local python_versions="3.10 3.11 3.12 3.13 3.14"
+    local python_versions="3.11 3.12 3.13 3.14"
     local platform_tags="macosx_12_0_arm64"
     local check_flight=OFF
   else
-    local python_versions="3.10 3.11 3.12 3.13 3.14"
+    local python_versions="3.11 3.12 3.13 3.14"
     local platform_tags="macosx_12_0_x86_64"
   fi
 
diff --git a/dev/tasks/python-sdist/github.yml 
b/dev/tasks/python-sdist/github.yml
index ac357f1e88..36582fa0e2 100644
--- a/dev/tasks/python-sdist/github.yml
+++ b/dev/tasks/python-sdist/github.yml
@@ -39,7 +39,7 @@ jobs:
       - name: Test sdist
         run: archery docker run ubuntu-python-sdist-test
         env:
-          UBUNTU: 22.04
+          UBUNTU: 24.04
           PYARROW_VERSION: {{ arrow.no_rc_version }}
 
       - uses: actions/upload-artifact@v6
diff --git a/dev/tasks/python-wheels/github.linux.yml 
b/dev/tasks/python-wheels/github.linux.yml
index e211343953..e9e36566ba 100644
--- a/dev/tasks/python-wheels/github.linux.yml
+++ b/dev/tasks/python-wheels/github.linux.yml
@@ -107,7 +107,7 @@ jobs:
       - name: Test wheel on Ubuntu 22.04
         shell: bash
         if: |
-          '{{ python_version }}' == '3.10' && '{{ linux_wheel_kind }}' == 
'manylinux'
+          '{{ python_version }}' == '3.11' && '{{ linux_wheel_kind }}' == 
'manylinux'
         env:
           UBUNTU: "22.04"
         run: |
diff --git a/dev/tasks/tasks.yml b/dev/tasks/tasks.yml
index 56a9ce1472..c443c5a7e7 100644
--- a/dev/tasks/tasks.yml
+++ b/dev/tasks/tasks.yml
@@ -138,8 +138,7 @@ tasks:
 
   ########################### Python Wheels ############################
 
-{% for python_version, python_tag, abi_tag in [("3.10", "cp310", "cp310"),
-                                               ("3.11", "cp311", "cp311"),
+{% for python_version, python_tag, abi_tag in [("3.11", "cp311", "cp311"),
                                                ("3.12", "cp312", "cp312"),
                                                ("3.13", "cp313", "cp313"),
                                                ("3.14", "cp314", "cp314"),
@@ -496,7 +495,7 @@ tasks:
         UBUNTU: 22.04
       image: ubuntu-cpp-emscripten
 
-{% for python_version in ["3.10", "3.11", "3.12", "3.13", "3.14"] %}
+{% for python_version in ["3.11", "3.12", "3.13", "3.14"] %}
   test-conda-python-{{ python_version }}:
     ci: github
     template: docker-tests/github.linux.yml
@@ -557,20 +556,12 @@ tasks:
       image: debian-python
 {% endfor %}
 
-  test-ubuntu-22.04-python-3:
-    ci: github
-    template: docker-tests/github.linux.yml
-    params:
-      env:
-        UBUNTU: 22.04
-      image: ubuntu-python
-
   test-ubuntu-24.04-python-3:
     ci: github
     template: docker-tests/github.linux.yml
     params:
       env:
-        UBUNTU: 24.04
+        UBUNTU: "24.04"
       image: ubuntu-python
 
   test-fedora-42-python-3:
@@ -736,12 +727,12 @@ tasks:
 
   ############################## Integration tests ############################
 
-{% for python_version, pandas_version, numpy_version, cache_leaf in [("3.10", 
"1.3.4", "1.21.2", True),
-                                                                     ("3.11", 
"latest", "latest", False),
-                                                                     ("3.12", 
"latest", "1.26", False),
+{% for python_version, pandas_version, numpy_version, cache_leaf in [("3.11", 
"1.5.2", "1.23.2", True),
                                                                      ("3.12", 
"latest", "latest", False),
-                                                                     ("3.13", 
"nightly", "nightly", False),
-                                                                     ("3.13", 
"upstream_devel", "nightly", False)] %}
+                                                                     ("3.13", 
"latest", "1.26.2", False),
+                                                                     ("3.13", 
"latest", "latest", False),
+                                                                     ("3.14", 
"nightly", "nightly", False),
+                                                                     ("3.14", 
"upstream_devel", "nightly", False)] %}
   test-conda-python-{{ python_version }}-pandas-{{ pandas_version }}-numpy-{{ 
numpy_version }}:
     ci: github
     template: docker-tests/github.linux.yml
@@ -781,13 +772,13 @@ tasks:
 {% endfor %}
 
 {% for hdfs_version in ["2.9.2", "3.2.1"] %}
-  test-conda-python-3.10-hdfs-{{ hdfs_version }}:
+  test-conda-python-3.11-hdfs-{{ hdfs_version }}:
     ci: github
     template: docker-tests/github.linux.yml
     params:
       env:
         HDFS: "{{ hdfs_version }}"
-        PYTHON: "3.10"
+        PYTHON: "3.11"
       image: conda-python-hdfs
 {% endfor %}
 
diff --git a/docs/source/developers/continuous_integration/archery.rst 
b/docs/source/developers/continuous_integration/archery.rst
index b20ba5c2fc..98c8e59764 100644
--- a/docs/source/developers/continuous_integration/archery.rst
+++ b/docs/source/developers/continuous_integration/archery.rst
@@ -26,7 +26,7 @@ utility called Archery.
 Installation
 ------------
 
-Archery requires Python 3.10 or later. It is recommended to install Archery in
+Archery requires Python 3.11 or later. It is recommended to install Archery in
 *editable* mode with the ``-e`` flag to automatically update the installation
 when pulling the Arrow repository. After cloning the Arrow repository, from
 the top level directory install Archery by using the command
diff --git a/docs/source/developers/continuous_integration/crossbow.rst 
b/docs/source/developers/continuous_integration/crossbow.rst
index ba99a1397a..8ec1e22b9a 100644
--- a/docs/source/developers/continuous_integration/crossbow.rst
+++ b/docs/source/developers/continuous_integration/crossbow.rst
@@ -108,7 +108,7 @@ to step 3:
 
    or pass as an argument to the CLI script ``--github-token``
 
-6. Install Python (minimum supported version is 3.10):
+6. Install Python (minimum supported version is 3.11):
 
    | Miniconda is preferred, see installation instructions:
    | https://conda.io/docs/user-guide/install/index.html
diff --git a/docs/source/python/install.rst b/docs/source/python/install.rst
index dd23e6bc04..5fa9ab6c77 100644
--- a/docs/source/python/install.rst
+++ b/docs/source/python/install.rst
@@ -27,7 +27,7 @@ Linux distributions. We strongly recommend using a 64-bit 
system.
 Python Compatibility
 --------------------
 
-PyArrow is currently compatible with Python 3.10, 3.11, 3.12, 3.13 and 3.14.
+PyArrow is currently compatible with Python 3.11, 3.12, 3.13 and 3.14.
 
 Using Conda
 -----------
@@ -73,8 +73,8 @@ Dependencies
 
 Optional dependencies
 
-* **NumPy 1.21.2** or higher.
-* **pandas 1.3.4** or higher,
+* **NumPy 1.23.2** or higher.
+* **pandas 1.5.2** or higher,
 * **cffi**.
 
 Additional packages PyArrow is compatible with are :ref:`fsspec 
<filesystem-fsspec>`
diff --git a/python/examples/minimal_build/build_conda.sh 
b/python/examples/minimal_build/build_conda.sh
index 3b3d7bd4e3..46dbab9090 100755
--- a/python/examples/minimal_build/build_conda.sh
+++ b/python/examples/minimal_build/build_conda.sh
@@ -26,7 +26,7 @@ MINICONDA=$WORKDIR/miniconda-for-arrow
 LIBRARY_INSTALL_DIR=$WORKDIR/local-libs
 CPP_BUILD_DIR=$WORKDIR/arrow-cpp-build
 ARROW_ROOT=/arrow
-PYTHON=3.10
+PYTHON=3.11
 
 git config --global --add safe.directory $ARROW_ROOT
 
diff --git a/python/pyproject.toml b/python/pyproject.toml
index 0054e1a268..9ceb5da927 100644
--- a/python/pyproject.toml
+++ b/python/pyproject.toml
@@ -32,7 +32,7 @@ backend-path = ["."]
 [project]
 name = "pyarrow"
 dynamic = ["version"]
-requires-python = ">=3.10"
+requires-python = ">=3.11"
 description = "Python library for Apache Arrow"
 readme = {file = "README.md", content-type = "text/markdown"}
 license = "Apache-2.0"
@@ -41,7 +41,6 @@ license-files = [
     "NOTICE.txt",
 ]
 classifiers  = [
-    'Programming Language :: Python :: 3.10',
     'Programming Language :: Python :: 3.11',
     'Programming Language :: Python :: 3.12',
     'Programming Language :: Python :: 3.13',
@@ -123,7 +122,7 @@ exclude = [
 # TODO: Enable type checking once stubs are merged
 [tool.pyright]
 pythonPlatform = "All"
-pythonVersion = "3.10"
+pythonVersion = "3.11"
 include = ["pyarrow-stubs"]
 exclude = [
     "pyarrow",
diff --git a/r/tests/testthat/test-python.R b/r/tests/testthat/test-python.R
index 7f7419a6bb..0da8539dde 100644
--- a/r/tests/testthat/test-python.R
+++ b/r/tests/testthat/test-python.R
@@ -22,8 +22,8 @@ test_that("install_pyarrow", {
   # Windows CI machine doesn't pick up the right python or something
   skip_on_os("windows")
   skip_if_not_installed("reticulate")
-  # PyArrow doesn't support Python 3.9 or earlier
-  skip_on_python_older_than("3.10")
+  # PyArrow doesn't support Python 3.10 or earlier
+  skip_on_python_older_than("3.11")
   # no pyarrow wheels for macos 10.13
   skip_if(on_macos_10_13_or_lower())
 

Reply via email to