Skip to content

fix: avoid deprecated unitless operations for NumPy 2.5 compatibility - #17589

Merged
parthea merged 1 commit into
mainfrom
fix-build-db-dtypes
Jun 30, 2026
Merged

fix: avoid deprecated unitless operations for NumPy 2.5 compatibility#17589
parthea merged 1 commit into
mainfrom
fix-build-db-dtypes

Conversation

@parthea

Copy link
Copy Markdown
Contributor

As per https://numpy.org/devdocs/release/2.5.0-notes.html, using the generic unit in numpy.timedelta64 is deprecated since this can lead to unexpected behavior such as non-transitive comparison.

This should fix the following errors (since warnings are treated as errors when testing)

2026-06-26T22:39:25.0532625Z ==================================== ERRORS ====================================
2026-06-26T22:39:25.0533378Z __________________ ERROR collecting tests/unit/test_arrow.py ___________________
2026-06-26T22:39:25.0533991Z tests/unit/test_arrow.py:24: in <module>
2026-06-26T22:39:25.0534413Z import db_dtypes
2026-06-26T22:39:25.0534767Z db_dtypes/__init__.py:30: in <module>
2026-06-26T22:39:25.0535219Z from db_dtypes import core
2026-06-26T22:39:25.0536530Z db_dtypes/core.py:46: in <module>
2026-06-26T22:39:25.0537237Z class BaseDatetimeArray(pandas_backports.OpsMixin, _mixins.NDArrayBackedExtensionArray):
2026-06-26T22:39:25.0537974Z db_dtypes/core.py:51: in BaseDatetimeArray
2026-06-26T22:39:25.0538450Z _internal_fill_value = numpy.datetime64("NaT")
2026-06-26T22:39:25.0538897Z ^^^^^^^^^^^^^^^^^^^^^^^
2026-06-26T22:39:25.0540172Z E DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0541561Z ___________________ ERROR collecting tests/unit/test_date.py ___________________
2026-06-26T22:39:25.0542129Z tests/unit/test_date.py:25: in <module>
2026-06-26T22:39:25.0542500Z import db_dtypes
2026-06-26T22:39:25.0542818Z db_dtypes/__init__.py:30: in <module>
2026-06-26T22:39:25.0543197Z from db_dtypes import core
2026-06-26T22:39:25.0543563Z db_dtypes/core.py:46: in <module>
2026-06-26T22:39:25.0544218Z class BaseDatetimeArray(pandas_backports.OpsMixin, _mixins.NDArrayBackedExtensionArray):
2026-06-26T22:39:25.0545002Z db_dtypes/core.py:51: in BaseDatetimeArray
2026-06-26T22:39:25.0545474Z _internal_fill_value = numpy.datetime64("NaT")
2026-06-26T22:39:25.0546102Z ^^^^^^^^^^^^^^^^^^^^^^^
2026-06-26T22:39:25.0547340Z E DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0548760Z ___________________ ERROR collecting tests/unit/test_json.py ___________________
2026-06-26T22:39:25.0549293Z tests/unit/test_json.py:22: in <module>
2026-06-26T22:39:25.0549664Z import db_dtypes
2026-06-26T22:39:25.0549980Z db_dtypes/__init__.py:30: in <module>
2026-06-26T22:39:25.0550363Z from db_dtypes import core
2026-06-26T22:39:25.0550720Z db_dtypes/core.py:46: in <module>
2026-06-26T22:39:25.0551394Z class BaseDatetimeArray(pandas_backports.OpsMixin, _mixins.NDArrayBackedExtensionArray):
2026-06-26T22:39:25.0552080Z db_dtypes/core.py:51: in BaseDatetimeArray
2026-06-26T22:39:25.0552528Z _internal_fill_value = numpy.datetime64("NaT")
2026-06-26T22:39:25.0552958Z ^^^^^^^^^^^^^^^^^^^^^^^
2026-06-26T22:39:25.0554405Z E DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0555740Z _____________ ERROR collecting tests/unit/test_pandas_backports.py _____________
2026-06-26T22:39:25.0556539Z tests/unit/test_pandas_backports.py:18: in <module>
2026-06-26T22:39:25.0557049Z import db_dtypes.pandas_backports as pandas_backports
2026-06-26T22:39:25.0557498Z db_dtypes/__init__.py:30: in <module>
2026-06-26T22:39:25.0557873Z from db_dtypes import core
2026-06-26T22:39:25.0558234Z db_dtypes/core.py:46: in <module>
2026-06-26T22:39:25.0558863Z class BaseDatetimeArray(pandas_backports.OpsMixin, _mixins.NDArrayBackedExtensionArray):
2026-06-26T22:39:25.0559525Z db_dtypes/core.py:51: in BaseDatetimeArray
2026-06-26T22:39:25.0559977Z _internal_fill_value = numpy.datetime64("NaT")
2026-06-26T22:39:25.0560384Z ^^^^^^^^^^^^^^^^^^^^^^^
2026-06-26T22:39:25.0561598Z E DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0562922Z ___________________ ERROR collecting tests/unit/test_time.py ___________________
2026-06-26T22:39:25.0563453Z tests/unit/test_time.py:22: in <module>
2026-06-26T22:39:25.0563840Z import db_dtypes # noqa
2026-06-26T22:39:25.0564160Z ^^^^^^^^^^^^^^^^
2026-06-26T22:39:25.0564460Z db_dtypes/__init__.py:30: in <module>
2026-06-26T22:39:25.0565066Z from db_dtypes import core
2026-06-26T22:39:25.0565406Z db_dtypes/core.py:46: in <module>
2026-06-26T22:39:25.0566176Z class BaseDatetimeArray(pandas_backports.OpsMixin, _mixins.NDArrayBackedExtensionArray):
2026-06-26T22:39:25.0566858Z db_dtypes/core.py:51: in BaseDatetimeArray
2026-06-26T22:39:25.0567282Z _internal_fill_value = numpy.datetime64("NaT")
2026-06-26T22:39:25.0567695Z ^^^^^^^^^^^^^^^^^^^^^^^
2026-06-26T22:39:25.0568851Z E DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0570116Z =========================== short test summary info ============================
2026-06-26T22:39:25.0571523Z ERROR tests/unit/test_arrow.py - DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0573906Z ERROR tests/unit/test_date.py - DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0576196Z ERROR tests/unit/test_json.py - DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0578467Z ERROR tests/unit/test_pandas_backports.py - DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.
2026-06-26T22:39:25.0580766Z ERROR tests/unit/test_time.py - DeprecationWarning: The 'generic' unit for NumPy timedelta is deprecated, and will raise an error in the future. This includes implicit conversion of bare integers (e.g. `+ 1`).Please use a specific unit instead.

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates db-dtypes to explicitly specify the nanosecond ("ns") unit for numpy.datetime64 initializations and dynamically aligns the epoch's dtype with the target array's dtype during timedelta calculations. The review feedback suggests simplifying the epoch alignment in both astype and __add__ by directly casting _NPEPOCH to the target array's dtype instead of manually extracting the datetime unit.

Comment threadpackages/db-dtypes/db_dtypes/__init__.py Outdated
Comment threadpackages/db-dtypes/db_dtypes/__init__.py Outdated
@parthea
partheaforce-pushed the fix-build-db-dtypes branch from e72a566 to edd3bf9CompareJune 29, 2026 17:45
@parthea

Copy link
Copy Markdown
ContributorAuthor

/gemini review

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates db-dtypes to explicitly specify the "ns" unit for numpy.datetime64 epoch and NaT initializations, and casts the epoch to match the array's dtype during subtraction. The feedback highlights potential unit mismatches: hardcoding "ns" for _internal_fill_value in the base class BaseDatetimeArray can cause issues for subclasses like DateArray (which uses "D"), and returning "ns" NaT in _datetime may also conflict with DateArray's underlying storage unit.

Comment threadpackages/db-dtypes/db_dtypes/core.py Outdated
Comment threadpackages/db-dtypes/db_dtypes/__init__.py Outdated
@parthea
partheaforce-pushed the fix-build-db-dtypes branch 3 times, most recently from 2e543ac to 086356eCompareJune 29, 2026 20:00
@parthea

Copy link
Copy Markdown
ContributorAuthor

/gemini review

@parthea
parthea marked this pull request as ready for review June 29, 2026 20:01
@parthea
parthea requested review from a team as code ownersJune 29, 2026 20:01
@parthea
parthea requested review from tswast and removed request for a teamJune 29, 2026 20:01

@gemini-code-assistgemini-code-assistBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request addresses numpy unit mismatches by dynamically determining the resolution unit for _internal_fill_value and matching the epoch's dtype with the array's dtype during subtraction. Additionally, it updates coverage settings and adds a unit test for the fallback behavior of _internal_fill_value. The review feedback highlights a potential regression in astype where casting the epoch could result in returning day-resolution deltas instead of the requested nanosecond-resolution deltas, and suggests using the local ndarray variable in _internal_fill_value to avoid redundant attribute lookups.

Comment threadpackages/db-dtypes/db_dtypes/__init__.py Outdated
Comment threadpackages/db-dtypes/db_dtypes/core.py Outdated
@partheaparthea assigned parthea and unassigned tswastJun 30, 2026
@parthea
parthea marked this pull request as draft June 30, 2026 13:33
@parthea
partheaforce-pushed the fix-build-db-dtypes branch 6 times, most recently from 3e889e2 to 315a93eCompareJune 30, 2026 15:14
@parthea
partheaforce-pushed the fix-build-db-dtypes branch from 315a93e to d7c437fCompareJune 30, 2026 15:26
@parthea
parthea marked this pull request as ready for review June 30, 2026 15:28
@partheaparthea assigned tswast and unassigned partheaJun 30, 2026
@parthea
parthea merged commit d0b2abc into mainJun 30, 2026
30 checks passed
@parthea
parthea deleted the fix-build-db-dtypes branch June 30, 2026 15:54
This was referenced Jun 30, 2026
quirogas pushed a commit that referenced this pull request Jul 7, 2026
🤖 I have created a release *beep* *boop*
---
<details><summary>db-dtypes: 1.7.1</summary>
##
[1.7.1](db-dtypes-v1.7.0...db-dtypes-v1.7.1)
(2026-07-07)
### Bug Fixes
* avoid deprecated unitless operations for NumPy 2.5 compatibility
([#17589](#17589))
([d0b2abc](d0b2abc))
</details>
<details><summary>gapic-generator: 1.37.0</summary>
##
[1.37.0](gapic-generator-v1.36.0...gapic-generator-v1.37.0)
(2026-07-07)
### Features
* implement native PEP 0810 lazy loading
([#17591](#17591))
([8a1270c](8a1270c))
### Bug Fixes
* **deps:** bump google-api-core to 2.25.0
([#17599](#17599))
([8b359e2](8b359e2))
* **tests:** add --cov-append to gapic-generator and proto-plus to
preserve monorepo coverage
([#17603](#17603))
([2ddcf4d](2ddcf4d))
</details>
<details><summary>google-auth: 2.55.2</summary>
##
[2.55.2](google-auth-v2.55.1...google-auth-v2.55.2)
(2026-07-07)
### Bug Fixes
* **auth:** Agentic Identites mTLS gaps fix _is_mtls and SslCredentials.
([#17387](#17387))
([7bfa41a](7bfa41a))
* **auth:** align mTLS discovery and enforce fail-fast transport
configuration.
([#17470](#17470))
([f492d3d](f492d3d))
* **auth:** handle PermissionError on workload certificates to avoid
startup hang and crash
([#17568](#17568))
([f538ad8](f538ad8))
</details>
<details><summary>google-cloud-agentregistry: 0.1.0</summary>
## 0.1.0 (2026-07-07)
### Features
* **google/cloud/agentregistry/v1:** add google-cloud-agentregistry
([#17565](#17565))
([f479800](f479800))
</details>
<details><summary>google-cloud-biglake-hive: 0.3.1</summary>
##
[0.3.1](google-cloud-biglake-hive-v0.3.0...google-cloud-biglake-hive-v0.3.1)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-bigquery: 3.42.2</summary>
##
[3.42.2](google-cloud-bigquery-v3.42.1...google-cloud-bigquery-v3.42.2)
(2026-07-07)
### Bug Fixes
* **bigquery:** avoid SSLError retry loop
([#17489](#17489))
([8248d8e](8248d8e))
* include amended user agent in read client
([#17592](#17592))
([c43caee](c43caee))
</details>
<details><summary>google-cloud-binary-authorization: 1.18.0</summary>
##
[1.18.0](google-cloud-binary-authorization-v1.17.0...google-cloud-binary-authorization-v1.18.0)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-chronicle: 0.6.2</summary>
##
[0.6.2](google-cloud-chronicle-v0.6.1...google-cloud-chronicle-v0.6.2)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-dataform: 0.11.2</summary>
##
[0.11.2](google-cloud-dataform-v0.11.1...google-cloud-dataform-v0.11.2)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-dataproc: 5.30.0</summary>
##
[5.30.0](google-cloud-dataproc-v5.29.0...google-cloud-dataproc-v5.30.0)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-datastore: 2.26.0</summary>
##
[2.26.0](google-cloud-datastore-v2.25.0...google-cloud-datastore-v2.26.0)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-dialogflow: 2.50.0</summary>
##
[2.50.0](google-cloud-dialogflow-v2.49.0...google-cloud-dialogflow-v2.50.0)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-kms: 3.15.0</summary>
##
[3.15.0](google-cloud-kms-v3.14.0...google-cloud-kms-v3.15.0)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-logging: 3.16.1</summary>
##
[3.16.1](google-cloud-logging-v3.16.0...google-cloud-logging-v3.16.1)
(2026-07-07)
### Documentation
* **logging:** fix StructuredLogHandler docstring parameter name
([#17625](#17625))
([32862f0](32862f0)),
closes
[#17604](#17604)
</details>
<details><summary>google-cloud-modelarmor: 0.7.1</summary>
##
[0.7.1](google-cloud-modelarmor-v0.7.0...google-cloud-modelarmor-v0.7.1)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-network-security: 0.13.3</summary>
##
[0.13.3](google-cloud-network-security-v0.13.2...google-cloud-network-security-v0.13.3)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-saasplatform-saasservicemgmt:
0.7.1</summary>
##
[0.7.1](google-cloud-saasplatform-saasservicemgmt-v0.7.0...google-cloud-saasplatform-saasservicemgmt-v0.7.1)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-securesourcemanager: 0.6.1</summary>
##
[0.6.1](google-cloud-securesourcemanager-v0.6.0...google-cloud-securesourcemanager-v0.6.1)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>google-cloud-storage: 3.12.1</summary>
##
[3.12.1](google-cloud-storage-v3.12.0...google-cloud-storage-v3.12.1)
(2026-07-07)
### Bug Fixes
* **storage:** log occasional (1 in 5 million) additional bytes received
from GCS in read path
([#17423](#17423))
([335c12f](335c12f))
</details>
<details><summary>google-cloud-support: 0.5.1</summary>
##
[0.5.1](google-cloud-support-v0.5.0...google-cloud-support-v0.5.1)
(2026-07-07)
### Features
* update googleapis and regenerate
([#17635](#17635))
([9638879](9638879))
</details>
<details><summary>proto-plus: 1.28.1</summary>
##
[1.28.1](proto-plus-v1.28.0...proto-plus-v1.28.1)
(2026-07-07)
### Bug Fixes
* **tests:** add --cov-append to gapic-generator and proto-plus to
preserve monorepo coverage
([#17603](#17603))
([2ddcf4d](2ddcf4d))
</details>
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
---------
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@parthea@tswast