Pandas version checks

  • [X] I have checked that this issue has not already been reported.

  • [X] I have confirmed this bug exists on the latest version of pandas.

  • [X] I have confirmed this bug exists on the main branch of pandas.

Reproducible Example

pandas master branch:

import pandas as pd
import numpy
>>> pd.Series(['1970-01-01', '1970-01-01', '1970-01-01'], dtype="datetime64[ns]").astype(numpy.datetime64, copy=False)
*** TypeError: Cannot cast DatetimeArray to dtype datetime64

Issue Description

I'm not sure whether it is expect behavior. I can repro on main branch, but can not repro on 1.4.x. I know pandas community introduce a new feature about ENH: DTI/DTA.astype support non-nano . But the new feature disable the original code tree. In this case, the original code tree will locate on

        elif self.tz is None and is_datetime64_dtype(dtype) and dtype != self.dtype:
            # unit conversion e.g. datetime64[s]
            return self._ndarray.astype(dtype)

But now, it is

        return dtl.DatetimeLikeArrayMixin.astype(self, dtype, copy)

And raise an error.

Expected Behavior

>>> import pandas as pd
>>> import numpy
>>> pd.Series(['1970-01-01', '1970-01-01', '1970-01-01'], dtype="datetime64[ns]").astype(numpy.datetime64, copy=False)
0   1970-01-01
1   1970-01-01
2   1970-01-01
dtype: datetime64[ns]

Installed Versions

pandas-1.5.0.dev0+1135.gc711be009b

Comment From: mroeschke

cc @jbrockmendel

Comment From: jbrockmendel

Looks like passing dtype=np.datetime64 is equivalent to passing dtype = "datetime64", which we don't accept bc it is unit-less, but numpy accepts when we pass it to self._ndarray.astype(dtype). So the new behavior is "more correct"

Comment From: mroeschke

Is it worth defaulting this case to nanosecond or just documenting this change?

Comment From: jbrockmendel

i think just document, otherwise we're special-casing in this one place and will be inconsistent elsewhere

Comment From: jorisvandenbossche

I ran into this issue as well in the dask test suite, this change is giving some failures there (https://github.com/dask/dask/pull/9465).

So this worked before:

In [1]: s = pd.Series(pd.date_range("2012-01-01", periods=3))

In [2]: s.astype(np.dtype("M8"))
Out[2]: 
0   2012-01-01
1   2012-01-02
2   2012-01-03
dtype: datetime64[ns]

and is now indeed raising.

I agree that we should ideally raise in this case, but given this has been working fine, I think we should consider deprecating this first.

Comment From: jesusch

Seems this was reintroduced in pandas 2.0.0?

Comment From: maxschulz-COL

Seem to have the same issue, worked fine in pandas == 1.5.3 and not breaks in 2.0.0