Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

riku-sakamoto
Copy link
Contributor

@riku-sakamoto riku-sakamoto commented Aug 23, 2025

(Updated from previous PR description.)

This PR deprecates the generic unit in np.timedelta64 and np.datetime64. Using this unit can lead to unexpected behavior in some cases (see #28287 for details). Using generic unit now raises a FutureWarning.

  • Allowed behavior (no warning):
import numpy as np

np.timedelta64(10, 's')  # seconds
np.timedelta64("NaT") # NaT is allowed with generic
  • Deprecated behavior (raises FutureWarning):
import numpy as np

np.timedelta64(10)  # generic unit
np.timedelta64(10, 's') + 5 # adding integer to timedelta with generic unit
np.datetime64('2020-01-01') + 2

Changes

Main

  • Raise FutureWarning when np.timedelta64 or np.datetime64 is constructed with the generic unit.
  • Add tests to ensure the warning is raised in relevant scenarios.
  • Add Release notes

Test

Test updates fall into three categories.

  • Suppressing the warning in tests where the generic unit seems to be used intentionally. (@pytest.mark.filterwarning("ignore::FutureWarning")

  • Adding tests to check generic unit's behavior. Some tests uses generic timedelta in pytest.mark.parametrize. In such cases, the warnings cannot be suppressed with pytest.mark.filterwarnings. Instead, this PR add additional tests to check only generic unit's behavior.

  • Modifying tests to use an explicit unit instead of generic.

Future Work

These works are not included in this PR and I am planning to do them in future PRs. But, if you think they should be included in this PR, please let me know. I am happy to do so.

  • NaT is allowed with generic unit. We may want to disallow this in future.

    • This may requires to seek consensus.
  • np.timedelta64() creates a generic timedelta with value 0. We may want to change this to create a timedelta with an explicit unit (e.g., np.timedelta64(0, 's')) instead.

    • This may requires to seek consensus.
  • np.ones_like now raises FutureWarning when the input array is of timedelta type.

    • It seems that we should set 1 value with specific unit.
  • np.all_close now raises FutureWarning when the input arrays are of datetime or timedelta type.

    • atol is not allowed to be timedelta64 because it is supposed to be printed with g format. ("{atol:g}" in the code.)

@riku-sakamoto riku-sakamoto marked this pull request as ready for review August 23, 2025 10:30
pytest.ini Outdated
@@ -27,6 +27,8 @@ filterwarnings =
ignore:\n\n `numpy.distutils`:DeprecationWarning
# Ignore DeprecationWarning from typing.mypy_plugin
ignore:`numpy.typing.mypy_plugin` is deprecated:DeprecationWarning
# Ignore Runtime Warning from datetime by calculating unitless value and unitful value
ignore:Casting from unitless timedelta to unitful timedelta is ambiguous.:RuntimeWarning
Copy link
Contributor

Choose a reason for hiding this comment

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

I believe that if we do this, we'd likely want at least one test case that actually makes sure that the warning is issued.

I see locally that there are 18 failures if this is removed though, and we wouldn't want 18 checks for the warning. Still, it might be nice if we could suppress most of them but enforce at least one of them.

That said, the discussion in the matching issue suggests that the decision here may be tricky, so it may be best to wait for some design feedback first before making changes.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@tylerjereddy

Thank you for the feedback!
I agree that adding a test case to check this warning makes sense.
As you suggested, I’ll wait for the design feedback before making the change.

@charris charris added the 56 - Needs Release Note. Needs an entry in doc/release/upcoming_changes label Sep 1, 2025
@charris
Copy link
Member

charris commented Sep 1, 2025

Needs a release note.

…4` to unitful one.

This is a temporary solution to handle numpy#28287.
Rasing `RuntimeWarning` encourages users to pay attention to the behavior.
@riku-sakamoto riku-sakamoto force-pushed the enhancement/raise_warning_when_generic_unit_casting branch 2 times, most recently from 7b3b00a to 902f4ac Compare September 7, 2025 11:42
@riku-sakamoto riku-sakamoto force-pushed the enhancement/raise_warning_when_generic_unit_casting branch from 53036ac to 93ae278 Compare September 7, 2025 16:49
….datetime64`

The ``generic`` unit in `numpy.timedelta64` and `numpy.datetime64` is now
deprecated. Using it will raise a ``FutureWarning``. (See numpy#28287)
@riku-sakamoto riku-sakamoto force-pushed the enhancement/raise_warning_when_generic_unit_casting branch from 93ae278 to 9e14d71 Compare September 7, 2025 21:28
@riku-sakamoto riku-sakamoto changed the title ENH: Raise RuntimeWarning when casting from a unitless np.timedelta64 to unitful one. DEP: Deprecate 'generic' unit in np.timedelta64 and np.datetime64 Sep 7, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
01 - Enhancement 56 - Needs Release Note. Needs an entry in doc/release/upcoming_changes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants