Repository: pandas-dev/pandas

Issue:
API: pd.array convert unsupported dt64/td64 to supported?
```python
dtype = np.dtype("M8[h]")
arr = pd.array([], dtype=dtype)

>>> arr
<PandasArray>
[]
Length: 0, dtype: datetime64[h]
```


In most cases we'd like to align behavior across different constructors (pd.Series, pd.Index, pd.array).  One case where we currently don't do that is with an un-supported numpy dt64/td64 dtype.   pd.Series/pd.Index will raise on this, while pd.array will wrap it in a PandasArray.

I propose we deprecate that behavior and raise in pd.array like we would in Series/Index.

xref #27460


Discussion:
@jbrockmendel @lithomas1 I can work this one.

Do we want to raise a warning to deprecate the current behavior before we raise an error?
take
Will need to be a deprecation

Patch:
diff --git a/doc/source/whatsnew/v2.1.0.rst b/doc/source/whatsnew/v2.1.0.rst
index b517f5fc38d5e..e154ca2cd3884 100644
--- a/doc/source/whatsnew/v2.1.0.rst
+++ b/doc/source/whatsnew/v2.1.0.rst
@@ -320,7 +320,9 @@ Deprecations
 - Deprecated strings ``T``, ``t``, ``L`` and ``l`` denoting units in :func:`to_timedelta` (:issue:`52536`)
 - Deprecated the "method" and "limit" keywords on :meth:`Series.fillna`, :meth:`DataFrame.fillna`, :meth:`SeriesGroupBy.fillna`, :meth:`DataFrameGroupBy.fillna`, and :meth:`Resampler.fillna`, use ``obj.bfill()`` or ``obj.ffill()`` instead (:issue:`53394`)
 - Deprecated the ``method`` and ``limit`` keywords in :meth:`DataFrame.replace` and :meth:`Series.replace` (:issue:`33302`)
+- Deprecated the use of non-supported datetime64 and timedelta64 resolutions with :func:`pandas.array`. Supported resolutions are: "s", "ms", "us", "ns" resolutions (:issue:`53058`)
 - Deprecated values "pad", "ffill", "bfill", "backfill" for :meth:`Series.interpolate` and :meth:`DataFrame.interpolate`, use ``obj.ffill()`` or ``obj.bfill()`` instead (:issue:`53581`)
+-
 
 .. ---------------------------------------------------------------------------
 .. _whatsnew_210.performance:
diff --git a/pandas/core/construction.py b/pandas/core/construction.py
index 014c99c87ad00..9112c7e52a348 100644
--- a/pandas/core/construction.py
+++ b/pandas/core/construction.py
@@ -14,6 +14,7 @@
     cast,
     overload,
 )
+import warnings
 
 import numpy as np
 from numpy import ma
@@ -31,6 +32,7 @@
     DtypeObj,
     T,
 )
+from pandas.util._exceptions import find_stack_level
 
 from pandas.core.dtypes.base import ExtensionDtype
 from pandas.core.dtypes.cast import (
@@ -369,6 +371,16 @@ def array(
     if lib.is_np_dtype(dtype, "m") and is_supported_unit(get_unit_from_dtype(dtype)):
         return TimedeltaArray._from_sequence(data, dtype=dtype, copy=copy)
 
+    elif lib.is_np_dtype(dtype, "mM"):
+        warnings.warn(
+            r"datetime64 and timedelta64 dtype resolutions other than "
+            r"'s', 'ms', 'us', and 'ns' are deprecated. "
+            r"In future releases passing unsupported resolutions will "
+            r"raise an exception.",
+            FutureWarning,
+            stacklevel=find_stack_level(),
+        )
+
     return PandasArray._from_sequence(data, dtype=dtype, copy=copy)
 
 


Test patch:
diff --git a/pandas/tests/arrays/test_array.py b/pandas/tests/arrays/test_array.py
index 337cdaa26a3d4..d5c1d5bbd03b0 100644
--- a/pandas/tests/arrays/test_array.py
+++ b/pandas/tests/arrays/test_array.py
@@ -1,5 +1,6 @@
 import datetime
 import decimal
+import re
 
 import numpy as np
 import pytest
@@ -28,6 +29,20 @@
 )
 
 
+@pytest.mark.parametrize("dtype_unit", ["M8[h]", "M8[m]", "m8[h]", "M8[m]"])
+def test_dt64_array(dtype_unit):
+    # PR 53817
+    dtype_var = np.dtype(dtype_unit)
+    msg = (
+        r"datetime64 and timedelta64 dtype resolutions other than "
+        r"'s', 'ms', 'us', and 'ns' are deprecated. "
+        r"In future releases passing unsupported resolutions will "
+        r"raise an exception."
+    )
+    with tm.assert_produces_warning(FutureWarning, match=re.escape(msg)):
+        pd.array([], dtype=dtype_var)
+
+
 @pytest.mark.parametrize(
     "data, dtype, expected",
     [