This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 415cb70f877 Limit pandas to < 3 for DataFrame XComs (#70791)
415cb70f877 is described below
commit 415cb70f87784cc074d6db7844a07579587b5f0f
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sat Aug 1 14:18:03 2026 +0200
Limit pandas to < 3 for DataFrame XComs (#70791)
* Limit pandas to < 3 for DataFrame XComs
Under pandas 3 a DataFrame does not round trip through an XCom the way it
does
under pandas 2. The public classes moved to the `pandas` namespace, so the
same
object qualifies as `pandas.DataFrame` rather than
`pandas.core.frame.DataFrame`
and the serde registry -- keyed on the latter -- does not dispatch to the
pandas
serializer at all. The caller gets serde's generic "cannot serialize object
of
type" with nothing pointing at pandas. Beyond that, the dtypes differ: an
`object` column reads back as `str` and missing values as `nan` rather than
`None`, so the reader's pandas version, not the writer's, decides what a
task
receives.
Declare `pandas<3` where Airflow declares pandas, and back it with a runtime
check, since pandas is an optional dependency and the constraint alone
cannot be
relied on -- a deployment may install pandas 3 directly or pull it in
through
another package.
The check needs the pandas 3 qualname registered to be reachable at all:
without `pandas.DataFrame` in the registry the request never reaches this
module.
It is registered for that reason only, to refuse the value with a message
that
names pandas and says what to do, not to support it.
Reads are refused as well as writes. A payload written under pandas 2 comes
back
with pandas 3 dtypes, so accepting it would hand the task different data
than was
pushed, with no signal.
Moving from pandas 2 to pandas 3 is a deliberate migration for users to
make.
Support for it is not dropped, only deferred.
Generated-by: Claude Opus 5 (1M context) following the guidelines at
https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#gen-ai-assisted-contributions
* Sync uv.lock with the pandas < 3 constraint
* Add significant newsfragment for the pandas < 3 limit
* Apply the pandas < 3 limit to the remaining providers
The XCom limit only binds where Airflow declares pandas. Thirteen providers
pin
pandas independently of common-sql, so a deployment installing any of them
could
still resolve pandas 3 and reach the runtime refusal rather than being held
on a
supported version by the constraint.
pandas-gbq is deliberately untouched -- a different package, unaffected by
this.
Provider READMEs and uv.lock are regenerated to match.
* Regenerate provider docs index for the pandas < 3 pins
The update-providers-build-files hook renders the extras table in each
provider's docs/index.rst from its pyproject dependencies. Fourteen
providers
show the pandas extra, so the pin change widens those tables.
* Explain the pandas upper bound at every site and drop a vacuous test
contributing-docs/13_airflow_dependencies_and_extras.rst asks for a comment
saying why whenever a dependency is upper-bound, and AGENTS.md asks for the
tracking URL in the file rather than only in a PR comment. All 45 specifiers
across 15 files landed without either. Add the rationale and a pointer to
the
pandas 3 support PR above each block, so whoever decides when the cap comes
off
does not have to reconstruct it.
test_pandas_2_dataframe_xcom_still_round_trips passed unchanged on main:
nothing
read pd.__version__ before this PR, so monkeypatching it to a 2.x value
while the
installed pandas is already 2.x changed nothing observable, and the round
trip is
already covered by test_pandas_serializers. Dropped.
---------
Co-authored-by: Rahul Vats <[email protected]>
---
airflow-core/newsfragments/70791.significant.rst | 35 +++++++++
providers/amazon/docs/index.rst | 8 +-
providers/amazon/pyproject.toml | 15 +++-
providers/apache/hdfs/README.rst | 12 +--
providers/apache/hdfs/docs/index.rst | 12 +--
providers/apache/hdfs/pyproject.toml | 15 +++-
providers/apache/hive/README.rst | 12 +--
providers/apache/hive/docs/index.rst | 12 +--
providers/apache/hive/pyproject.toml | 15 +++-
providers/common/sql/docs/index.rst | 8 +-
providers/common/sql/pyproject.toml | 15 +++-
providers/databricks/README.rst | 12 +--
providers/databricks/docs/index.rst | 12 +--
providers/databricks/pyproject.toml | 15 +++-
providers/exasol/README.rst | 12 +--
providers/exasol/docs/index.rst | 12 +--
providers/exasol/pyproject.toml | 15 +++-
providers/google/README.rst | 12 +--
providers/google/docs/index.rst | 12 +--
providers/google/pyproject.toml | 15 +++-
providers/papermill/README.rst | 12 +--
providers/papermill/docs/index.rst | 12 +--
providers/papermill/pyproject.toml | 15 +++-
providers/postgres/docs/index.rst | 8 +-
providers/postgres/pyproject.toml | 15 +++-
providers/presto/README.rst | 12 +--
providers/presto/docs/index.rst | 12 +--
providers/presto/pyproject.toml | 15 +++-
providers/salesforce/README.rst | 12 +--
providers/salesforce/docs/index.rst | 12 +--
providers/salesforce/pyproject.toml | 15 +++-
providers/snowflake/README.rst | 6 +-
providers/snowflake/docs/index.rst | 6 +-
providers/snowflake/pyproject.toml | 15 +++-
providers/trino/README.rst | 12 +--
providers/trino/docs/index.rst | 12 +--
providers/trino/pyproject.toml | 15 +++-
providers/weaviate/README.rst | 12 +--
providers/weaviate/docs/index.rst | 12 +--
providers/weaviate/pyproject.toml | 15 +++-
task-sdk/pyproject.toml | 15 +++-
.../src/airflow/sdk/serde/serializers/pandas.py | 45 +++++++++++
task-sdk/tests/task_sdk/serde/test_serializers.py | 28 +++++++
uv.lock | 90 +++++++++++-----------
44 files changed, 471 insertions(+), 228 deletions(-)
diff --git a/airflow-core/newsfragments/70791.significant.rst
b/airflow-core/newsfragments/70791.significant.rst
new file mode 100644
index 00000000000..827f22bc68f
--- /dev/null
+++ b/airflow-core/newsfragments/70791.significant.rst
@@ -0,0 +1,35 @@
+pandas is limited to ``< 3``; DataFrame XComs are refused on pandas 3
+
+A ``pandas.DataFrame`` does not survive an XCom round trip under pandas 3 the
way it does
+under pandas 2, so this version of Airflow constrains pandas to ``< 3`` and
refuses DataFrame
+XComs at runtime when a newer pandas is installed anyway.
+
+Two things change under pandas 3. Its public classes are exposed from the
``pandas``
+namespace, so a DataFrame qualifies as ``pandas.DataFrame`` rather than
+``pandas.core.frame.DataFrame`` and the XCom serializer registry -- keyed on
the latter --
+never dispatches to the pandas serializer. And the dtypes differ: an
``object`` column reads
+back as ``str``, and missing values as ``nan`` rather than ``None``, so the
*reader's* pandas
+version decides what a task receives rather than the writer's.
+
+Because pandas is an optional dependency, the ``< 3`` constraint alone cannot
be relied on --
+a deployment may install pandas 3 directly, or pull it in through another
package. It is
+therefore backed by a runtime check.
+
+**Behaviour changes:**
+
+- With pandas 3 or newer installed, pushing **or** pulling a ``DataFrame``
through XCom now
+ raises ``RuntimeError`` naming the installed pandas version and the
supported range.
+ Reads are refused as well as writes, because a payload written under pandas
2 reads back
+ with pandas 3 dtypes and would otherwise hand the task different data than
was pushed,
+ with no signal.
+- Previously the same situation produced an opaque
+ ``TypeError: cannot serialize object of type <class 'pandas.DataFrame'>``
from the
+ serializer registry, with nothing identifying pandas as the cause.
+- Deployments that pass DataFrames through XCom must pin ``pandas < 3`` in the
environment
+ that runs their tasks. Deployments that do not use DataFrame XComs are
unaffected at
+ runtime.
+- Nothing changes for pandas 2 users.
+
+**This defers pandas 3 support rather than dropping it.** Moving from pandas 2
to pandas 3
+is a deliberate migration for users to make, given the dtype changes it brings
to data that
+has already been written. Support for pandas 3 will be enabled in a future
Airflow release.
diff --git a/providers/amazon/docs/index.rst b/providers/amazon/docs/index.rst
index 6a01e3506d6..446a2e4df51 100644
--- a/providers/amazon/docs/index.rst
+++ b/providers/amazon/docs/index.rst
@@ -171,9 +171,9 @@ Install them when installing from PyPI. For example:
pip install apache-airflow-providers-amazon[aiobotocore]
-====================
============================================================================================================================================================
+====================
=====================================================================================================================================================================
Extra Dependencies
-====================
============================================================================================================================================================
+====================
=====================================================================================================================================================================
``aiobotocore`` ``aiobotocore>=3.0.0``
``cncf.kubernetes`` ``apache-airflow-providers-cncf-kubernetes>=7.2.0``
``s3fs`` ``s3fs>=2023.10.0``
@@ -186,14 +186,14 @@ Extra Dependencies
``imap`` ``apache-airflow-providers-imap``
``microsoft.azure`` ``apache-airflow-providers-microsoft-azure``
``mongo`` ``apache-airflow-providers-mongo``
-``pandas`` ``pandas>=2.1.2; python_version <"3.13"``,
``pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"``,
``pandas>=2.3.3; python_version >="3.14"``
+``pandas`` ``pandas>=2.1.2,<3; python_version <"3.13"``,
``pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"``,
``pandas>=2.3.3,<3; python_version >="3.14"``
``openlineage`` ``apache-airflow-providers-openlineage>=2.3.0``
``salesforce`` ``apache-airflow-providers-salesforce``
``ssh`` ``apache-airflow-providers-ssh``
``standard`` ``apache-airflow-providers-standard``
``common.messaging`` ``apache-airflow-providers-common-messaging>=2.0.0``
``sqlalchemy`` ``sqlalchemy>=1.4.54``
-====================
============================================================================================================================================================
+====================
=====================================================================================================================================================================
Downloading official packages
-----------------------------
diff --git a/providers/amazon/pyproject.toml b/providers/amazon/pyproject.toml
index a8a4224b7d0..e8200c48494 100644
--- a/providers/amazon/pyproject.toml
+++ b/providers/amazon/pyproject.toml
@@ -130,9 +130,18 @@ dependencies = [
"apache-airflow-providers-mongo"
]
"pandas" = [
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
]
"openlineage" = [
"apache-airflow-providers-openlineage>=2.3.0"
diff --git a/providers/apache/hdfs/README.rst b/providers/apache/hdfs/README.rst
index 6326ee5eeda..7841ffb143d 100644
--- a/providers/apache/hdfs/README.rst
+++ b/providers/apache/hdfs/README.rst
@@ -51,19 +51,19 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
==================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
==================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``hdfs[avro,dataframe,kerberos]`` ``>=2.5.4; python_version <
"3.12"``
``hdfs[avro,dataframe,kerberos]`` ``>=2.7.3; python_version >=
"3.12"``
``fastavro`` ``>=1.10.0; python_version >=
"3.13" and python_version < "3.14"``
``fastavro`` ``>=1.12.1; python_version >=
"3.14"``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
==================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
The changelog for the provider package can be found in the
`changelog
<https://airflow.apache.org/docs/apache-airflow-providers-apache-hdfs/4.12.1/changelog.html>`_.
diff --git a/providers/apache/hdfs/docs/index.rst
b/providers/apache/hdfs/docs/index.rst
index 6b6979fe7b4..1656ba5093d 100644
--- a/providers/apache/hdfs/docs/index.rst
+++ b/providers/apache/hdfs/docs/index.rst
@@ -85,19 +85,19 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
==================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
==================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``hdfs[avro,dataframe,kerberos]`` ``>=2.5.4; python_version <
"3.12"``
``hdfs[avro,dataframe,kerberos]`` ``>=2.7.3; python_version >=
"3.12"``
``fastavro`` ``>=1.10.0; python_version >=
"3.13" and python_version < "3.14"``
``fastavro`` ``>=1.12.1; python_version >=
"3.14"``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
==================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
Downloading official packages
-----------------------------
diff --git a/providers/apache/hdfs/pyproject.toml
b/providers/apache/hdfs/pyproject.toml
index 2907dd03aba..fa9baec7f7e 100644
--- a/providers/apache/hdfs/pyproject.toml
+++ b/providers/apache/hdfs/pyproject.toml
@@ -65,9 +65,18 @@ dependencies = [
'hdfs[avro,dataframe,kerberos]>=2.7.3;python_version>="3.12"',
'fastavro>=1.10.0; python_version>="3.13" and python_version<"3.14"',
'fastavro>=1.12.1; python_version>="3.14"',
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
]
[dependency-groups]
diff --git a/providers/apache/hive/README.rst b/providers/apache/hive/README.rst
index e07ecc84053..c2daf9e4d44 100644
--- a/providers/apache/hive/README.rst
+++ b/providers/apache/hive/README.rst
@@ -50,19 +50,19 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``hmsclient`` ``>=0.1.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``pyhive[hive_pure_sasl]`` ``>=0.7.0``
``jmespath`` ``>=0.7.0``
-==========================================
=================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/apache/hive/docs/index.rst
b/providers/apache/hive/docs/index.rst
index 58da4e77be1..83982387686 100644
--- a/providers/apache/hive/docs/index.rst
+++ b/providers/apache/hive/docs/index.rst
@@ -99,19 +99,19 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``hmsclient`` ``>=0.1.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``pyhive[hive_pure_sasl]`` ``>=0.7.0``
``jmespath`` ``>=0.7.0``
-==========================================
=================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/apache/hive/pyproject.toml
b/providers/apache/hive/pyproject.toml
index 34e41892cfb..50f395028e8 100644
--- a/providers/apache/hive/pyproject.toml
+++ b/providers/apache/hive/pyproject.toml
@@ -63,9 +63,18 @@ dependencies = [
"apache-airflow-providers-common-compat>=1.12.0",
"apache-airflow-providers-common-sql>=1.32.0",
"hmsclient>=0.1.0",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
"pyhive[hive_pure_sasl]>=0.7.0",
"jmespath>=0.7.0",
]
diff --git a/providers/common/sql/docs/index.rst
b/providers/common/sql/docs/index.rst
index ed9ac1aa46f..ec33b3329e5 100644
--- a/providers/common/sql/docs/index.rst
+++ b/providers/common/sql/docs/index.rst
@@ -141,10 +141,10 @@ Install them when installing from PyPI. For example:
pip install apache-airflow-providers-common-sql[pandas]
-==================
=======================================================================================================================================================================
+==================
================================================================================================================================================================================
Extra Dependencies
-==================
=======================================================================================================================================================================
-``pandas`` ``pandas[sql-other]>=2.1.2; python_version <"3.13"``,
``pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"``,
``pandas>=2.3.3; python_version >="3.14"``
+==================
================================================================================================================================================================================
+``pandas`` ``pandas[sql-other]>=2.1.2,<3; python_version <"3.13"``,
``pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"``,
``pandas>=2.3.3,<3; python_version >="3.14"``
``openlineage`` ``apache-airflow-providers-openlineage``
``polars`` ``polars>=1.26.0``
``sqlalchemy`` ``sqlalchemy>=1.4.54``
@@ -152,7 +152,7 @@ Extra Dependencies
``datafusion`` ``datafusion>=50.0.0,<52.0.0``
``pyiceberg-core`` ``pyiceberg-core>=0.8.0``
``apache.iceberg`` ``apache-airflow-providers-apache-iceberg``
-==================
=======================================================================================================================================================================
+==================
================================================================================================================================================================================
Downloading official packages
-----------------------------
diff --git a/providers/common/sql/pyproject.toml
b/providers/common/sql/pyproject.toml
index 5d93bb5d12a..d0d4541d587 100644
--- a/providers/common/sql/pyproject.toml
+++ b/providers/common/sql/pyproject.toml
@@ -72,11 +72,20 @@ dependencies = [
# Any change in the dependencies is preserved when the file is regenerated
[project.optional-dependencies]
"pandas" = [
- 'pandas[sql-other]>=2.1.2; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas[sql-other]>=2.1.2,<3; python_version <"3.13"',
# Technically - we should add "sql-other" here as well, but this will only
be possible when we move
# to sqlalchemy 2+ TODO(potiuk): do so.
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
]
"openlineage" = [
"apache-airflow-providers-openlineage"
diff --git a/providers/databricks/README.rst b/providers/databricks/README.rst
index 293fc4609b7..494cd6be7e4 100644
--- a/providers/databricks/README.rst
+++ b/providers/databricks/README.rst
@@ -50,9 +50,9 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
==================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
==================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.13.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
@@ -60,13 +60,13 @@ PIP package Version required
``databricks-sql-connector`` ``>=4.4.0``
``aiohttp`` ``>=3.14.0,<4``
``mergedeep`` ``>=1.3.4``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``pyarrow`` ``>=16.1.0; python_version <
"3.13"``
``pyarrow`` ``>=18.0.0; python_version >=
"3.13" and python_version < "3.14"``
``pyarrow`` ``>=22.0.0; python_version >=
"3.14"``
-==========================================
==================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/databricks/docs/index.rst
b/providers/databricks/docs/index.rst
index cbfc357c735..55835fb43c0 100644
--- a/providers/databricks/docs/index.rst
+++ b/providers/databricks/docs/index.rst
@@ -98,9 +98,9 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
==================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
==================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.13.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
@@ -108,13 +108,13 @@ PIP package Version
required
``databricks-sql-connector`` ``>=4.4.0``
``aiohttp`` ``>=3.14.0,<4``
``mergedeep`` ``>=1.3.4``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``pyarrow`` ``>=16.1.0; python_version <
"3.13"``
``pyarrow`` ``>=18.0.0; python_version >=
"3.13" and python_version < "3.14"``
``pyarrow`` ``>=22.0.0; python_version >=
"3.14"``
-==========================================
==================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/databricks/pyproject.toml
b/providers/databricks/pyproject.toml
index 40fac68ee2b..74594af076d 100644
--- a/providers/databricks/pyproject.toml
+++ b/providers/databricks/pyproject.toml
@@ -66,9 +66,18 @@ dependencies = [
"databricks-sql-connector>=4.4.0",
"aiohttp>=3.14.0, <4",
"mergedeep>=1.3.4",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
"pyarrow>=16.1.0; python_version < '3.13'",
"pyarrow>=18.0.0; python_version >= '3.13' and python_version < '3.14'",
"pyarrow>=22.0.0; python_version >= '3.14'",
diff --git a/providers/exasol/README.rst b/providers/exasol/README.rst
index c74b2a48367..424978788c4 100644
--- a/providers/exasol/README.rst
+++ b/providers/exasol/README.rst
@@ -50,17 +50,17 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``pyexasol`` ``>=0.26.0,<2``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
=================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
Optional dependencies
----------------------
diff --git a/providers/exasol/docs/index.rst b/providers/exasol/docs/index.rst
index 13cb541eb12..3c01a40238b 100644
--- a/providers/exasol/docs/index.rst
+++ b/providers/exasol/docs/index.rst
@@ -95,17 +95,17 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``pyexasol`` ``>=0.26.0,<2``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
=================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
Optional dependencies
---------------------
diff --git a/providers/exasol/pyproject.toml b/providers/exasol/pyproject.toml
index 636109b9840..7c30e390498 100644
--- a/providers/exasol/pyproject.toml
+++ b/providers/exasol/pyproject.toml
@@ -65,9 +65,18 @@ dependencies = [
# Capped to 1.x: pyexasol 2.x ships stricter types that break the exasol
hook.
# Remove the cap after migrating; tracked at
https://github.com/apache/airflow/issues/69123
"pyexasol>=0.26.0,<2",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
]
# The optional dependencies should be modified in place in the generated file
diff --git a/providers/google/README.rst b/providers/google/README.rst
index 015137fe2d6..bd1c048e1a7 100644
--- a/providers/google/README.rst
+++ b/providers/google/README.rst
@@ -57,9 +57,9 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
==================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
==================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.13.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
@@ -125,9 +125,9 @@ PIP package Version required
``httpx`` ``>=0.25.0``
``looker-sdk`` ``>=22.4.0,!=24.18.0``
``pandas-gbq`` ``>=0.7.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``proto-plus`` ``>=1.26.0``
``pyarrow`` ``>=18.0.0; python_version <
"3.14"``
``pyarrow`` ``>=22.0.0; python_version >=
"3.14"``
@@ -138,7 +138,7 @@ PIP package Version required
``tenacity`` ``>=8.3.0``
``immutabledict`` ``>=4.2.0``
``types-protobuf`` ``>=5.27.0,!=5.29.1.20250402``
-==========================================
==================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/google/docs/index.rst b/providers/google/docs/index.rst
index 2863bdaaea8..05c764f3c1c 100644
--- a/providers/google/docs/index.rst
+++ b/providers/google/docs/index.rst
@@ -110,9 +110,9 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
==================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
==================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.13.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
@@ -178,9 +178,9 @@ PIP package Version required
``httpx`` ``>=0.25.0``
``looker-sdk`` ``>=22.4.0,!=24.18.0``
``pandas-gbq`` ``>=0.7.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``proto-plus`` ``>=1.26.0``
``pyarrow`` ``>=18.0.0; python_version <
"3.14"``
``pyarrow`` ``>=22.0.0; python_version >=
"3.14"``
@@ -191,7 +191,7 @@ PIP package Version required
``tenacity`` ``>=8.3.0``
``immutabledict`` ``>=4.2.0``
``types-protobuf`` ``>=5.27.0,!=5.29.1.20250402``
-==========================================
==================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/google/pyproject.toml b/providers/google/pyproject.toml
index 1e9a606d237..e750891904d 100644
--- a/providers/google/pyproject.toml
+++ b/providers/google/pyproject.toml
@@ -134,9 +134,18 @@ dependencies = [
# See https://github.com/looker-open-source/sdk-codegen/issues/1518
"looker-sdk>=22.4.0,!=24.18.0",
"pandas-gbq>=0.7.0",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
"proto-plus>=1.26.0",
# Used to write parquet files by BaseSqlToGCSOperator
"pyarrow>=18.0.0; python_version < '3.14'",
diff --git a/providers/papermill/README.rst b/providers/papermill/README.rst
index 83033141bd4..d694e6cbcf7 100644
--- a/providers/papermill/README.rst
+++ b/providers/papermill/README.rst
@@ -50,19 +50,19 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.8.0``
``papermill[all]`` ``>=2.6.0``
``scrapbook[all]`` ``>=0.5.0``
``ipykernel`` ``>=6.29.4``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``nbconvert`` ``>=7.16.1``
-==========================================
=================================================================
+==========================================
====================================================================
The changelog for the provider package can be found in the
`changelog
<https://airflow.apache.org/docs/apache-airflow-providers-papermill/3.13.1/changelog.html>`_.
diff --git a/providers/papermill/docs/index.rst
b/providers/papermill/docs/index.rst
index 72c162cf6fd..00618cd5b01 100644
--- a/providers/papermill/docs/index.rst
+++ b/providers/papermill/docs/index.rst
@@ -97,19 +97,19 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.8.0``
``papermill[all]`` ``>=2.6.0``
``scrapbook[all]`` ``>=0.5.0``
``ipykernel`` ``>=6.29.4``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``nbconvert`` ``>=7.16.1``
-==========================================
=================================================================
+==========================================
====================================================================
Downloading official packages
-----------------------------
diff --git a/providers/papermill/pyproject.toml
b/providers/papermill/pyproject.toml
index 37d6fb5ab28..32ed9c96a91 100644
--- a/providers/papermill/pyproject.toml
+++ b/providers/papermill/pyproject.toml
@@ -64,9 +64,18 @@ dependencies = [
"papermill[all]>=2.6.0",
"scrapbook[all]>=0.5.0",
"ipykernel>=6.29.4",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
"nbconvert>=7.16.1",
]
diff --git a/providers/postgres/docs/index.rst
b/providers/postgres/docs/index.rst
index a236c0a4afc..59a91c40b19 100644
--- a/providers/postgres/docs/index.rst
+++ b/providers/postgres/docs/index.rst
@@ -143,18 +143,18 @@ Install them when installing from PyPI. For example:
pip install apache-airflow-providers-postgres[amazon]
-===================
============================================================================================================================================================
+===================
=====================================================================================================================================================================
Extra Dependencies
-===================
============================================================================================================================================================
+===================
=====================================================================================================================================================================
``amazon`` ``apache-airflow-providers-amazon>=2.6.0``
``asyncpg`` ``asyncpg>=0.30.0``
``microsoft.azure`` ``apache-airflow-providers-microsoft-azure>=12.8.0``
``openlineage`` ``apache-airflow-providers-openlineage``
-``pandas`` ``pandas>=2.1.2; python_version <"3.13"``,
``pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"``,
``pandas>=2.3.3; python_version >="3.14"``
+``pandas`` ``pandas>=2.1.2,<3; python_version <"3.13"``,
``pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"``,
``pandas>=2.3.3,<3; python_version >="3.14"``
``polars`` ``polars>=1.26.0``
``psycopg2`` ``psycopg2-binary>=2.9.9; python_version < '3.13'``,
``psycopg2-binary>=2.9.10; python_version >= '3.13'``
``sqlalchemy`` ``sqlalchemy>=1.4.54``
-===================
============================================================================================================================================================
+===================
=====================================================================================================================================================================
Downloading official packages
-----------------------------
diff --git a/providers/postgres/pyproject.toml
b/providers/postgres/pyproject.toml
index 1898cd5dc40..cf16e503e15 100644
--- a/providers/postgres/pyproject.toml
+++ b/providers/postgres/pyproject.toml
@@ -93,9 +93,18 @@ dependencies = [
"apache-airflow-providers-openlineage"
]
"pandas" = [
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
]
"polars" = [
"polars>=1.26.0"
diff --git a/providers/presto/README.rst b/providers/presto/README.rst
index 1d4639e04a3..c03a6a6f85e 100644
--- a/providers/presto/README.rst
+++ b/providers/presto/README.rst
@@ -50,19 +50,19 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``presto-python-client`` ``>=0.8.4``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``psycopg2-binary`` ``>=2.9.9; python_version <
"3.13"``
``psycopg2-binary`` ``>=2.9.10; python_version >=
"3.13"``
-==========================================
=================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/presto/docs/index.rst b/providers/presto/docs/index.rst
index 5730e6a1ab4..444e957c410 100644
--- a/providers/presto/docs/index.rst
+++ b/providers/presto/docs/index.rst
@@ -98,19 +98,19 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
``presto-python-client`` ``>=0.8.4``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``psycopg2-binary`` ``>=2.9.9; python_version <
"3.13"``
``psycopg2-binary`` ``>=2.9.10; python_version >=
"3.13"``
-==========================================
=================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/presto/pyproject.toml b/providers/presto/pyproject.toml
index a00507c407e..5ca2ef6590a 100644
--- a/providers/presto/pyproject.toml
+++ b/providers/presto/pyproject.toml
@@ -63,9 +63,18 @@ dependencies = [
"apache-airflow-providers-common-compat>=1.12.0",
"apache-airflow-providers-common-sql>=1.32.0",
"presto-python-client>=0.8.4",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
'psycopg2-binary>=2.9.9; python_version < "3.13"',
'psycopg2-binary>=2.9.10; python_version >= "3.13"',
]
diff --git a/providers/salesforce/README.rst b/providers/salesforce/README.rst
index 38e0e084e0b..4fe9041a2f7 100644
--- a/providers/salesforce/README.rst
+++ b/providers/salesforce/README.rst
@@ -50,16 +50,16 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.10.1``
``simple-salesforce`` ``>=1.0.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
=================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
The changelog for the provider package can be found in the
`changelog
<https://airflow.apache.org/docs/apache-airflow-providers-salesforce/5.14.1/changelog.html>`_.
diff --git a/providers/salesforce/docs/index.rst
b/providers/salesforce/docs/index.rst
index 6e541d4d407..89040f6fe16 100644
--- a/providers/salesforce/docs/index.rst
+++ b/providers/salesforce/docs/index.rst
@@ -97,16 +97,16 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.10.1``
``simple-salesforce`` ``>=1.0.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
=================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
Downloading official packages
-----------------------------
diff --git a/providers/salesforce/pyproject.toml
b/providers/salesforce/pyproject.toml
index d16ff50b679..c5dd164ed4c 100644
--- a/providers/salesforce/pyproject.toml
+++ b/providers/salesforce/pyproject.toml
@@ -62,9 +62,18 @@ dependencies = [
"apache-airflow>=2.11.0",
"apache-airflow-providers-common-compat>=1.10.1",
"simple-salesforce>=1.0.0",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
]
[dependency-groups]
diff --git a/providers/snowflake/README.rst b/providers/snowflake/README.rst
index 35393f30deb..c0ad40bbbab 100644
--- a/providers/snowflake/README.rst
+++ b/providers/snowflake/README.rst
@@ -56,9 +56,9 @@ PIP package Version required
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``pyarrow`` ``>=16.1.0; python_version <
"3.13"``
``pyarrow`` ``>=18.0.0; python_version >=
"3.13" and python_version < "3.14"``
``pyarrow`` ``>=22.0.0; python_version >=
"3.14"``
diff --git a/providers/snowflake/docs/index.rst
b/providers/snowflake/docs/index.rst
index c8e5bac2553..41384f3146f 100644
--- a/providers/snowflake/docs/index.rst
+++ b/providers/snowflake/docs/index.rst
@@ -105,9 +105,9 @@ PIP package Version required
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``pyarrow`` ``>=16.1.0; python_version <
"3.13"``
``pyarrow`` ``>=18.0.0; python_version >=
"3.13" and python_version < "3.14"``
``pyarrow`` ``>=22.0.0; python_version >=
"3.14"``
diff --git a/providers/snowflake/pyproject.toml
b/providers/snowflake/pyproject.toml
index 2387daeaf74..0a012407064 100644
--- a/providers/snowflake/pyproject.toml
+++ b/providers/snowflake/pyproject.toml
@@ -62,9 +62,18 @@ dependencies = [
"apache-airflow>=2.11.0",
"apache-airflow-providers-common-compat>=1.12.0",
"apache-airflow-providers-common-sql>=1.32.0",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
"pyarrow>=16.1.0; python_version < '3.13'",
"pyarrow>=18.0.0; python_version >= '3.13' and python_version < '3.14'",
"pyarrow>=22.0.0; python_version >= '3.14'",
diff --git a/providers/trino/README.rst b/providers/trino/README.rst
index 18560ebd45a..de67e5360ed 100644
--- a/providers/trino/README.rst
+++ b/providers/trino/README.rst
@@ -50,17 +50,17 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``trino`` ``>=0.319.0``
-==========================================
=================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/trino/docs/index.rst b/providers/trino/docs/index.rst
index fc9ae7cbd8e..0dc95488ffd 100644
--- a/providers/trino/docs/index.rst
+++ b/providers/trino/docs/index.rst
@@ -98,17 +98,17 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.12.0``
``apache-airflow-providers-common-sql`` ``>=1.32.0``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
``trino`` ``>=0.319.0``
-==========================================
=================================================================
+==========================================
====================================================================
Optional cross provider package dependencies
--------------------------------------------
diff --git a/providers/trino/pyproject.toml b/providers/trino/pyproject.toml
index f550d172bcc..1a3b384b2cd 100644
--- a/providers/trino/pyproject.toml
+++ b/providers/trino/pyproject.toml
@@ -62,9 +62,18 @@ dependencies = [
"apache-airflow>=2.11.0",
"apache-airflow-providers-common-compat>=1.12.0",
"apache-airflow-providers-common-sql>=1.32.0",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
"trino>=0.319.0",
]
diff --git a/providers/weaviate/README.rst b/providers/weaviate/README.rst
index 637d0ddbc14..60f119c1d55 100644
--- a/providers/weaviate/README.rst
+++ b/providers/weaviate/README.rst
@@ -50,17 +50,17 @@ The package supports the following python versions:
3.10,3.11,3.12,3.13,3.14
Requirements
------------
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.8.0``
``httpx`` ``>=0.25.0``
``weaviate-client`` ``>=4.16.0,!=4.16.7``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
=================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
The changelog for the provider package can be found in the
`changelog
<https://airflow.apache.org/docs/apache-airflow-providers-weaviate/3.4.0/changelog.html>`_.
diff --git a/providers/weaviate/docs/index.rst
b/providers/weaviate/docs/index.rst
index 06a443cdb59..ea7b313b7cf 100644
--- a/providers/weaviate/docs/index.rst
+++ b/providers/weaviate/docs/index.rst
@@ -99,17 +99,17 @@ Requirements
The minimum Apache Airflow version supported by this provider distribution is
``2.11.0``.
-==========================================
=================================================================
+==========================================
====================================================================
PIP package Version required
-==========================================
=================================================================
+==========================================
====================================================================
``apache-airflow`` ``>=2.11.0``
``apache-airflow-providers-common-compat`` ``>=1.8.0``
``httpx`` ``>=0.25.0``
``weaviate-client`` ``>=4.16.0,!=4.16.7``
-``pandas`` ``>=2.1.2; python_version <
"3.13"``
-``pandas`` ``>=2.2.3; python_version >=
"3.13" and python_version < "3.14"``
-``pandas`` ``>=2.3.3; python_version >=
"3.14"``
-==========================================
=================================================================
+``pandas`` ``>=2.1.2,<3; python_version <
"3.13"``
+``pandas`` ``>=2.2.3,<3; python_version >=
"3.13" and python_version < "3.14"``
+``pandas`` ``>=2.3.3,<3; python_version >=
"3.14"``
+==========================================
====================================================================
Downloading official packages
-----------------------------
diff --git a/providers/weaviate/pyproject.toml
b/providers/weaviate/pyproject.toml
index f71f91ace82..4152b48fc6f 100644
--- a/providers/weaviate/pyproject.toml
+++ b/providers/weaviate/pyproject.toml
@@ -63,9 +63,18 @@ dependencies = [
"apache-airflow-providers-common-compat>=1.8.0",
"httpx>=0.25.0",
"weaviate-client>=4.16.0,!=4.16.7",
- 'pandas>=2.1.2; python_version <"3.13"',
- 'pandas>=2.2.3; python_version >="3.13" and python_version <"3.14"',
- 'pandas>=2.3.3; python_version >="3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.1.2,<3; python_version <"3.13"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.2.3,<3; python_version >="3.13" and python_version <"3.14"',
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ 'pandas>=2.3.3,<3; python_version >="3.14"',
]
[dependency-groups]
diff --git a/task-sdk/pyproject.toml b/task-sdk/pyproject.toml
index bb8f7e2c3f4..6c540ee3bc9 100644
--- a/task-sdk/pyproject.toml
+++ b/task-sdk/pyproject.toml
@@ -224,9 +224,18 @@ dev = [
"apache-airflow-providers-common-sql",
"apache-airflow-providers-standard",
"apache-airflow-devel-common",
- "pandas>=2.1.2; python_version <\"3.13\"",
- "pandas>=2.2.3; python_version >=\"3.13\" and python_version <\"3.14\"",
- "pandas>=2.3.3; python_version >=\"3.14\""
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ "pandas>=2.1.2,<3; python_version <\"3.13\"",
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ "pandas>=2.2.3,<3; python_version >=\"3.13\" and python_version <\"3.14\"",
+ # pandas 3 changes the dtypes a DataFrame reads back with, so DataFrame
XComs do not
+ # round trip; capped until pandas 3 support lands.
+ # Tracked at https://github.com/apache/airflow/pull/70558
+ "pandas>=2.3.3,<3; python_version >=\"3.14\""
]
docs = [
"apache-airflow-devel-common[docs]",
diff --git a/task-sdk/src/airflow/sdk/serde/serializers/pandas.py
b/task-sdk/src/airflow/sdk/serde/serializers/pandas.py
index 72a2e818a11..a3562f5af47 100644
--- a/task-sdk/src/airflow/sdk/serde/serializers/pandas.py
+++ b/task-sdk/src/airflow/sdk/serde/serializers/pandas.py
@@ -22,11 +22,49 @@ from typing import TYPE_CHECKING
from airflow.sdk.module_loading import qualname
# lazy loading for performance reasons
+#
+# ``pandas.core.frame.DataFrame`` is what a DataFrame qualifies as under
pandas 2. Under
+# pandas 3 the public classes moved to the ``pandas`` namespace, so the same
object
+# qualifies as ``pandas.DataFrame``. That name is registered too, but *only*
so that the
+# registry dispatches here and this module can refuse it with an actionable
message --
+# without it the caller gets serde's generic "cannot serialize object of type"
instead.
+# See ``_reject_pandas_3`` below.
serializers = [
"pandas.core.frame.DataFrame",
+ "pandas.DataFrame",
]
deserializers = serializers
+# First pandas major version whose DataFrame XComs this version of Airflow
does not support.
+_FIRST_UNSUPPORTED_PANDAS_MAJOR = 3
+
+
+def _reject_pandas_3(pd) -> None:
+ """
+ Refuse a DataFrame XCom when the installed pandas is 3 or newer.
+
+ pandas is an optional dependency, so the ``<3`` constraint Airflow
declares cannot be
+ relied on: a deployment may install pandas 3 directly, or pull it in
through another
+ package. This is the runtime half of that constraint.
+
+ The failure is deliberate rather than best-effort. Under pandas 3 a
DataFrame round
+ trips through parquet with different dtypes than under pandas 2 -- an
``object`` column
+ comes back as ``str`` and missing values as ``nan`` rather than ``None``
-- so silently
+ accepting the value would hand tasks data that differs from what was
written, with no
+ signal. Failing on the write is the louder and more recoverable half of
that.
+ """
+ major = int(pd.__version__.split(".")[0])
+ if major < _FIRST_UNSUPPORTED_PANDAS_MAJOR:
+ return
+ raise RuntimeError(
+ f"DataFrame XComs are not supported with pandas {pd.__version__}: this
version of "
+ f"Airflow supports pandas < {_FIRST_UNSUPPORTED_PANDAS_MAJOR} for XCom
serialization. "
+ "Pin pandas < 3 in the environment that runs your tasks, or avoid
passing DataFrames "
+ "through XCom. Moving to pandas 3 is a deliberate migration -- its
DataFrames read "
+ "back with different dtypes -- and Airflow will enable it in a future
release."
+ )
+
+
if TYPE_CHECKING:
import pandas as pd
@@ -43,6 +81,8 @@ def serialize(o: object) -> tuple[U, str, int, bool]:
if not isinstance(o, pd.DataFrame):
return "", "", 0, False
+ _reject_pandas_3(pd)
+
# for now, we *always* serialize into in memory
# until we have a generic backend that manages
# sinks
@@ -62,6 +102,11 @@ def deserialize(cls: type, version: int, data: object) ->
pd.DataFrame:
if cls is not pd.DataFrame:
raise TypeError(f"do not know how to deserialize {qualname(cls)}")
+ # Reading is refused too, not just writing: a payload written under pandas
2 comes back
+ # with pandas 3 dtypes, so the task would silently receive different data
than was
+ # pushed. An error is the safer outcome.
+ _reject_pandas_3(pd)
+
if not isinstance(data, str):
raise TypeError(f"serialized {qualname(cls)} has wrong data type
{type(data)}")
diff --git a/task-sdk/tests/task_sdk/serde/test_serializers.py
b/task-sdk/tests/task_sdk/serde/test_serializers.py
index 7e2ade64ebd..8ef21272194 100644
--- a/task-sdk/tests/task_sdk/serde/test_serializers.py
+++ b/task-sdk/tests/task_sdk/serde/test_serializers.py
@@ -286,6 +286,34 @@ class TestSerializers:
assert serialize(123) == ("", "", 0, False)
+ def test_pandas_3_dataframe_name_is_registered(self):
+ """The pandas 3 qualname must be registered, or the guard below is
unreachable.
+
+ Under pandas 3 a DataFrame qualifies as ``pandas.DataFrame``. serde
dispatches on
+ that name, so if it is absent from the registry the caller gets the
generic
+ "cannot serialize object of type" from serde and never reaches this
module.
+ """
+ from airflow.sdk.serde.serializers.pandas import deserializers,
serializers
+
+ assert "pandas.DataFrame" in serializers
+ assert "pandas.core.frame.DataFrame" in deserializers
+
+ @pytest.mark.parametrize("version", ["3.0.0", "3.0.5", "4.1.2"])
+ def test_pandas_3_dataframe_xcom_is_refused(self, monkeypatch, version):
+ """pandas >= 3 must fail loudly on both write and read, not round trip
silently."""
+ import pandas as pd
+
+ from airflow.sdk.serde.serializers import pandas as pandas_serializer
+
+ monkeypatch.setattr(pd, "__version__", version)
+ df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4]})
+
+ with pytest.raises(RuntimeError, match=rf"DataFrame XComs are not
supported with pandas {version}"):
+ pandas_serializer.serialize(df)
+
+ with pytest.raises(RuntimeError, match=r"DataFrame XComs are not
supported with pandas"):
+ pandas_serializer.deserialize(pd.DataFrame, 1, "")
+
@pytest.mark.parametrize(
("klass", "version", "data", "msg"),
[
diff --git a/uv.lock b/uv.lock
index 61999ed455d..b61f10965f7 100644
--- a/uv.lock
+++ b/uv.lock
@@ -3180,9 +3180,9 @@ requires-dist = [
{ name = "jsonpath-ng", specifier = ">=1.5.3" },
{ name = "lxml", marker = "python_full_version < '3.13' and extra ==
'python3-saml'", specifier = ">=6.0.0" },
{ name = "marshmallow", specifier = ">=3" },
- { name = "pandas", marker = "python_full_version == '3.13.*' and extra ==
'pandas'", specifier = ">=2.2.3" },
- { name = "pandas", marker = "python_full_version < '3.13' and extra ==
'pandas'", specifier = ">=2.1.2" },
- { name = "pandas", marker = "python_full_version >= '3.14' and extra ==
'pandas'", specifier = ">=2.3.3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*' and extra ==
'pandas'", specifier = ">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version < '3.13' and extra ==
'pandas'", specifier = ">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14' and extra ==
'pandas'", specifier = ">=2.3.3,<3" },
{ name = "pyathena", specifier = ">=3.10.0" },
{ name = "python3-saml", marker = "python_full_version < '3.13' and extra
== 'python3-saml'", specifier = ">=1.16.0" },
{ name = "redshift-connector", specifier = ">=2.1.3" },
@@ -3488,9 +3488,9 @@ requires-dist = [
{ name = "fastavro", marker = "python_full_version >= '3.14'", specifier =
">=1.12.1" },
{ name = "hdfs", extras = ["avro", "dataframe", "kerberos"], marker =
"python_full_version < '3.12'", specifier = ">=2.5.4" },
{ name = "hdfs", extras = ["avro", "dataframe", "kerberos"], marker =
"python_full_version >= '3.12'", specifier = ">=2.7.3" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
]
[package.metadata.requires-dev]
@@ -3578,9 +3578,9 @@ requires-dist = [
{ name = "hmsclient", specifier = ">=0.1.0" },
{ name = "jmespath", specifier = ">=0.7.0" },
{ name = "kerberos", marker = "sys_platform != 'win32' and extra ==
'gssapi'", specifier = ">=1.3.0" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "pyhive", extras = ["hive-pure-sasl"], specifier = ">=0.7.0" },
{ name = "sqlalchemy", marker = "extra == 'sqlalchemy'", specifier =
">=1.4.54" },
{ name = "winkerberos", marker = "sys_platform == 'win32' and extra ==
'gssapi'", specifier = ">=0.7.0" },
@@ -4763,9 +4763,9 @@ requires-dist = [
{ name = "datafusion", marker = "extra == 'datafusion'", specifier =
">=50.0.0,<52.0.0" },
{ name = "methodtools", specifier = ">=0.4.7" },
{ name = "more-itertools", specifier = ">=9.0.0" },
- { name = "pandas", marker = "python_full_version == '3.13.*' and extra ==
'pandas'", specifier = ">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14' and extra ==
'pandas'", specifier = ">=2.3.3" },
- { name = "pandas", extras = ["sql-other"], marker = "python_full_version <
'3.13' and extra == 'pandas'", specifier = ">=2.1.2" },
+ { name = "pandas", marker = "python_full_version == '3.13.*' and extra ==
'pandas'", specifier = ">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14' and extra ==
'pandas'", specifier = ">=2.3.3,<3" },
+ { name = "pandas", extras = ["sql-other"], marker = "python_full_version <
'3.13' and extra == 'pandas'", specifier = ">=2.1.2,<3" },
{ name = "polars", marker = "extra == 'polars'", specifier = ">=1.26.0" },
{ name = "pyiceberg-core", marker = "extra == 'pyiceberg-core'", specifier
= ">=0.8.0" },
{ name = "sqlalchemy", marker = "extra == 'sqlalchemy'", specifier =
">=1.4.54" },
@@ -4877,9 +4877,9 @@ requires-dist = [
{ name = "fastavro", marker = "python_full_version >= '3.14' and extra ==
'avro'", specifier = ">=1.12.1" },
{ name = "fastavro", marker = "python_full_version < '3.14' and extra ==
'avro'", specifier = ">=1.9.0" },
{ name = "mergedeep", specifier = ">=1.3.4" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "pyarrow", marker = "python_full_version < '3.13'", specifier =
">=16.1.0" },
{ name = "pyarrow", marker = "python_full_version == '3.13.*'", specifier
= ">=18.0.0" },
{ name = "pyarrow", marker = "python_full_version >= '3.14'", specifier =
">=22.0.0" },
@@ -5241,9 +5241,9 @@ requires-dist = [
{ name = "apache-airflow", editable = "." },
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "pyexasol", specifier = ">=0.26.0,<2" },
{ name = "sqlalchemy", marker = "extra == 'sqlalchemy'", specifier =
">=1.4.54" },
]
@@ -5759,9 +5759,9 @@ requires-dist = [
{ name = "httpx", specifier = ">=0.25.0" },
{ name = "immutabledict", specifier = ">=4.2.0" },
{ name = "looker-sdk", specifier = ">=22.4.0,!=24.18.0" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "pandas-gbq", specifier = ">=0.7.0" },
{ name = "plyvel", marker = "python_full_version < '3.13' and extra ==
'leveldb'", specifier = ">=1.5.1" },
{ name = "proto-plus", specifier = ">=1.26.0" },
@@ -7085,9 +7085,9 @@ requires-dist = [
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
{ name = "ipykernel", specifier = ">=6.29.4" },
{ name = "nbconvert", specifier = ">=7.16.1" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "papermill", extras = ["all"], specifier = ">=2.6.0" },
{ name = "scrapbook", extras = ["all"], specifier = ">=0.5.0" },
]
@@ -7253,9 +7253,9 @@ requires-dist = [
{ name = "apache-airflow-providers-openlineage", marker = "extra ==
'openlineage'", editable = "providers/openlineage" },
{ name = "asyncpg", specifier = ">=0.30.0" },
{ name = "asyncpg", marker = "extra == 'asyncpg'", specifier = ">=0.30.0"
},
- { name = "pandas", marker = "python_full_version == '3.13.*' and extra ==
'pandas'", specifier = ">=2.2.3" },
- { name = "pandas", marker = "python_full_version < '3.13' and extra ==
'pandas'", specifier = ">=2.1.2" },
- { name = "pandas", marker = "python_full_version >= '3.14' and extra ==
'pandas'", specifier = ">=2.3.3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*' and extra ==
'pandas'", specifier = ">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version < '3.13' and extra ==
'pandas'", specifier = ">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14' and extra ==
'pandas'", specifier = ">=2.3.3,<3" },
{ name = "polars", marker = "extra == 'polars'", specifier = ">=1.26.0" },
{ name = "psycopg", extras = ["binary"], marker = "python_full_version <
'3.14'", specifier = ">=3.2.9" },
{ name = "psycopg", extras = ["binary"], marker = "python_full_version >=
'3.14'", specifier = ">=3.3.3" },
@@ -7326,9 +7326,9 @@ requires-dist = [
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
{ name = "apache-airflow-providers-google", marker = "extra == 'google'",
editable = "providers/google" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "presto-python-client", specifier = ">=0.8.4" },
{ name = "psycopg2-binary", marker = "python_full_version < '3.13'",
specifier = ">=2.9.9" },
{ name = "psycopg2-binary", marker = "python_full_version >= '3.13'",
specifier = ">=2.9.10" },
@@ -7459,9 +7459,9 @@ docs = [
requires-dist = [
{ name = "apache-airflow", editable = "." },
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "simple-salesforce", specifier = ">=1.0.0" },
]
@@ -7824,9 +7824,9 @@ requires-dist = [
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
{ name = "apache-airflow-providers-microsoft-azure", marker = "extra ==
'microsoft-azure'", editable = "providers/microsoft/azure" },
{ name = "apache-airflow-providers-openlineage", marker = "extra ==
'openlineage'", editable = "providers/openlineage" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "pyarrow", marker = "python_full_version < '3.13'", specifier =
">=16.1.0" },
{ name = "pyarrow", marker = "python_full_version == '3.13.*'", specifier
= ">=18.0.0" },
{ name = "pyarrow", marker = "python_full_version >= '3.14'", specifier =
">=22.0.0" },
@@ -8159,9 +8159,9 @@ requires-dist = [
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
{ name = "apache-airflow-providers-google", marker = "extra == 'google'",
editable = "providers/google" },
{ name = "apache-airflow-providers-openlineage", marker = "extra ==
'openlineage'", editable = "providers/openlineage" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "trino", specifier = ">=0.319.0" },
]
provides-extras = ["google", "openlineage"]
@@ -8297,9 +8297,9 @@ requires-dist = [
{ name = "apache-airflow", editable = "." },
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
{ name = "httpx", specifier = ">=0.25.0" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
{ name = "weaviate-client", specifier = ">=4.16.0,!=4.16.7" },
]
@@ -9070,9 +9070,9 @@ dev = [
{ name = "apache-airflow-devel-common", editable = "devel-common" },
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
{ name = "apache-airflow-providers-standard", editable =
"providers/standard" },
- { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2" },
- { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3" },
- { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3" },
+ { name = "pandas", marker = "python_full_version < '3.13'", specifier =
">=2.1.2,<3" },
+ { name = "pandas", marker = "python_full_version == '3.13.*'", specifier =
">=2.2.3,<3" },
+ { name = "pandas", marker = "python_full_version >= '3.14'", specifier =
">=2.3.3,<3" },
]
docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
mypy = [{ name = "apache-airflow-devel-common", extras = ["mypy"], editable =
"devel-common" }]