Repository: pandas-dev/pandas

Issue:
BUG: pd.Series fails to cast datetime series containing only NaT to timedelta type
### 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](https://pandas.pydata.org/docs/whatsnew/index.html) of pandas.

- [x] I have confirmed this bug exists on the [main branch](https://pandas.pydata.org/docs/dev/getting_started/install.html#installing-the-development-version-of-pandas) of pandas.


### Reproducible Example

```python
import pandas as pd

example = pd.Series(
    pd.Series([pd.NaT], dtype="datetime64[ns]"), dtype="timedelta64[ns]"
)
print(example.dtype)
```

### Issue Description

The above snipper outputs `datetime64[ns]`, which is against the documented behavior for `pd.Series`:

> **dtype** : str, numpy.dtype, or ExtensionDtype, optional
Data type for the output Series.

Reference https://github.com/theOehrly/Fast-F1/issues/674

### Expected Behavior

Expect the output series `example` to have `timedelta64[ns]` data type. Or for the snippet to emit an error or warning indicating this conversion is not available.

### Installed Versions

<details>

INSTALLED VERSIONS
------------------
commit                : 0691c5cf90477d3503834d983f69350f250a6ff7
python                : 3.12.4
python-bits           : 64
OS                    : Linux
OS-release            : 5.15.167.4-microsoft-standard-WSL2
Version               : #1 SMP Tue Nov 5 00:21:55 UTC 2024
machine               : x86_64
processor             : x86_64
byteorder             : little
LC_ALL                : None
LANG                  : C.UTF-8
LOCALE                : C.UTF-8

pandas                : 2.2.3
numpy                 : 2.0.1
pytz                  : 2024.1
dateutil              : 2.9.0.post0
pip                   : 24.2
Cython                : None
sphinx                : None
IPython               : 8.26.0
adbc-driver-postgresql: None
adbc-driver-sqlite    : None
bs4                   : 4.12.3
blosc                 : None
bottleneck            : None
dataframe-api-compat  : None
fastparquet           : None
fsspec                : None
html5lib              : None
hypothesis            : None
gcsfs                 : None
jinja2                : 3.1.5
lxml.etree            : None
matplotlib            : 3.9.2
numba                 : None
numexpr               : None
odfpy                 : None
openpyxl              : None
pandas_gbq            : None
psycopg2              : None
pymysql               : None
pyarrow               : None
pyreadstat            : None
pytest                : 8.3.3
python-calamine       : None
pyxlsb                : None
s3fs                  : None
scipy                 : 1.14.0
sqlalchemy            : None
tables                : None
tabulate              : None
xarray                : None
xlrd                  : None
xlsxwriter            : None
zstandard             : None
tzdata                : 2024.1
qtpy                  : None
pyqt5                 : None
</details>


Discussion:

Patch:
diff --git a/doc/source/user_guide/groupby.rst b/doc/source/user_guide/groupby.rst
index 4a32381a7d..4ec34db6ed 100644
--- a/doc/source/user_guide/groupby.rst
+++ b/doc/source/user_guide/groupby.rst
@@ -418,7 +418,7 @@ You can also include the grouping columns if you want to operate on them.
 
 .. note::
 
-   The ``groupby`` operation in Pandas drops the ``name`` field of the columns Index object
+   The ``groupby`` operation in pandas drops the ``name`` field of the columns Index object
    after the operation. This change ensures consistency in syntax between different
    column selection methods within groupby operations.
 
diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst
index daf323acff..07d06f61b3 100644
--- a/doc/source/user_guide/io.rst
+++ b/doc/source/user_guide/io.rst
@@ -990,7 +990,7 @@ Thousand separators
 
 For large numbers that have been written with a thousands separator, you can
 set the ``thousands`` keyword to a string of length 1 so that integers will be parsed
-correctly:
+correctly.
 
 By default, numbers with a thousands separator will be parsed as strings:
 
diff --git a/doc/source/user_guide/merging.rst b/doc/source/user_guide/merging.rst
index cfd2f40aa9..fb707674b4 100644
--- a/doc/source/user_guide/merging.rst
+++ b/doc/source/user_guide/merging.rst
@@ -586,7 +586,7 @@ A string argument to ``indicator`` will use the value as the name for the indica
 Overlapping value columns
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The merge ``suffixes`` argument takes a tuple of list of strings to append to
+The merge ``suffixes`` argument takes a tuple or list of strings to append to
 overlapping column names in the input :class:`DataFrame` to disambiguate the result
 columns:
 
@@ -979,7 +979,7 @@ nearest key rather than equal keys. For each row in the ``left`` :class:`DataFra
 the last row in the ``right`` :class:`DataFrame` are selected where the ``on`` key is less
 than the left's key. Both :class:`DataFrame` must be sorted by the key.
 
-Optionally an :func:`merge_asof` can perform a group-wise merge by matching the
+Optionally :func:`merge_asof` can perform a group-wise merge by matching the
 ``by`` key in addition to the nearest match on the ``on`` key.
 
 .. ipython:: python
diff --git a/doc/source/user_guide/scale.rst b/doc/source/user_guide/scale.rst
index 29df2994fb..d12993f7ea 100644
--- a/doc/source/user_guide/scale.rst
+++ b/doc/source/user_guide/scale.rst
@@ -5,7 +5,7 @@ Scaling to large datasets
 *************************
 
 pandas provides data structures for in-memory analytics, which makes using pandas
-to analyze datasets that are larger than memory datasets somewhat tricky. Even datasets
+to analyze datasets that are larger than memory somewhat tricky. Even datasets
 that are a sizable fraction of memory become unwieldy, as some pandas operations need
 to make intermediate copies.
 
diff --git a/doc/source/user_guide/timeseries.rst b/doc/source/user_guide/timeseries.rst
index 4299dca477..d046d13f71 100644
--- a/doc/source/user_guide/timeseries.rst
+++ b/doc/source/user_guide/timeseries.rst
@@ -1580,7 +1580,7 @@ the pandas objects.
    ts = ts[:5]
    ts.shift(1)
 
-The ``shift`` method accepts an ``freq`` argument which can accept a
+The ``shift`` method accepts a ``freq`` argument which can accept a
 ``DateOffset`` class or other ``timedelta``-like object or also an
 :ref:`offset alias <timeseries.offset_aliases>`.
 
@@ -2570,7 +2570,7 @@ because daylight savings time (DST) in a local time zone causes some times to oc
 twice within one day ("clocks fall back"). The following options are available:
 
 * ``'raise'``: Raises a ``ValueError`` (the default behavior)
-* ``'infer'``: Attempt to determine the correct offset base on the monotonicity of the timestamps
+* ``'infer'``: Attempt to determine the correct offset based on the monotonicity of the timestamps
 * ``'NaT'``: Replaces ambiguous times with ``NaT``
 * ``bool``: ``True`` represents a DST time, ``False`` represents non-DST time. An array-like of ``bool`` values is supported for a sequence of times.
 
diff --git a/doc/source/whatsnew/v3.0.0.rst b/doc/source/whatsnew/v3.0.0.rst
index 7ebbfd5bf7..570faa00e9 100644
--- a/doc/source/whatsnew/v3.0.0.rst
+++ b/doc/source/whatsnew/v3.0.0.rst
@@ -793,6 +793,7 @@ Styler
 Other
 ^^^^^
 - Bug in :class:`DataFrame` when passing a ``dict`` with a NA scalar and ``columns`` that would always return ``np.nan`` (:issue:`57205`)
+- Bug in :class:`Series` ignoring errors when trying to convert :class:`Series` input data to the given ``dtype`` (:issue:`60728`)
 - Bug in :func:`eval` on :class:`ExtensionArray` on including division ``/`` failed with a ``TypeError``. (:issue:`58748`)
 - Bug in :func:`eval` where the names of the :class:`Series` were not preserved when using ``engine="numexpr"``. (:issue:`10239`)
 - Bug in :func:`eval` with ``engine="numexpr"`` returning unexpected result for float division. (:issue:`59736`)
diff --git a/pandas/_config/config.py b/pandas/_config/config.py
index 8d1f611788..ce53e05608 100644
--- a/pandas/_config/config.py
+++ b/pandas/_config/config.py
@@ -433,6 +433,11 @@ def option_context(*args) -> Generator[None]:
     """
     Context manager to temporarily set options in a ``with`` statement.
 
+    This method allows users to set one or more pandas options temporarily
+    within a controlled block. The previous options' values are restored
+    once the block is exited. This is useful when making temporary adjustments
+    to pandas' behavior without affecting the global state.
+
     Parameters
     ----------
     *args : str | object
diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx
index 087d3119c3..bef1956996 100644
--- a/pandas/_libs/tslibs/period.pyx
+++ b/pandas/_libs/tslibs/period.pyx
@@ -2842,6 +2842,11 @@ class Period(_Period):
     """
     Represents a period of time.
 
+    A `Period` represents a specific time span rather than a point in time.
+    Unlike `Timestamp`, which represents a single instant, a `Period` defines a
+    duration, such as a month, quarter, or year. The exact representation is
+    determined by the `freq` parameter.
+
     Parameters
     ----------
     value : Period, str, datetime, date or pandas.Timestamp, default None
diff --git a/pandas/core/construction.py b/pandas/core/construction.py
index 50088804e0..ada492787a 100644
--- a/pandas/core/construction.py
+++ b/pandas/core/construction.py
@@ -81,6 +81,10 @@ def array(
     """
     Create an array.
 
+    This method constructs an array using pandas extension types when possible.
+    If `dtype` is specified, it determines the type of array returned. Otherwise,
+    pandas attempts to infer the appropriate dtype based on `data`.
+
     Parameters
     ----------
     data : Sequence of objects
diff --git a/pandas/core/frame.py b/pandas/core/frame.py
index 72fc099f57..57a7b9467a 100644
--- a/pandas/core/frame.py
+++ b/pandas/core/frame.py
@@ -1021,6 +1021,10 @@ class DataFrame(NDFrame, OpsMixin):
         """
         Return a tuple representing the dimensionality of the DataFrame.
 
+        Unlike the `len()` method, which only returns the number of rows, `shape`
+        provides both row and column counts, making it a more informative method for
+        understanding dataset size.
+
         See Also
         --------
         numpy.ndarray.shape : Tuple of array dimensions.
diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py
index 27865a60f6..d0c0ed29b6 100644
--- a/pandas/core/groupby/groupby.py
+++ b/pandas/core/groupby/groupby.py
@@ -3659,10 +3659,10 @@ class GroupBy(BaseGroupBy[NDFrameT]):
         Parameters
         ----------
         window : int, timedelta, str, offset, or BaseIndexer subclass
-            Size of the moving window.
+            Interval of the moving window.
 
-            If an integer, the fixed number of observations used for
-            each window.
+            If an integer, the delta between the start and end of each window.
+            The number of points in the window depends on the ``closed`` argument.
 
             If a timedelta, str, or offset, the time period of each window. Each
             window will be a variable sized based on the observations included in
@@ -3709,17 +3709,18 @@ class GroupBy(BaseGroupBy[NDFrameT]):
 
         closed : str, default None
             Determines the inclusivity of points in the window
-            If ``'right'``, (First, Last] the last point in the window
+
+            If ``'right'``, uses the window (first, last] meaning the last point
             is included in the calculations.
 
-            If ``'left'``, [First, Last) the first point in the window
+            If ``'left'``, uses the window [first, last) meaning the first point
             is included in the calculations.
 
-            If ``'both'``, [First, Last] all points in the window
-            are included in the calculations.
+            If ``'both'``, uses the window [first, last] meaning all points in
+            the window are included in the calculations.
 
-            If ``'neither'``, (First, Last) the first and last points
-            in the window are excludedfrom calculations.
+            If ``'neither'``, uses the window (first, last) meaning the first
+            and last points in the window are excluded from calculations.
 
             () and [] are referencing open and closed set
             notation respetively.
diff --git a/pandas/core/series.py b/pandas/core/series.py
index 4fa8b86fa4..351622135b 100644
--- a/pandas/core/series.py
+++ b/pandas/core/series.py
@@ -500,7 +500,7 @@ class Series(base.IndexOpsMixin, NDFrame):  # type: ignore[misc]
         # create/copy the manager
         if isinstance(data, SingleBlockManager):
             if dtype is not None:
-                data = data.astype(dtype=dtype, errors="ignore")
+                data = data.astype(dtype=dtype)
             elif copy:
                 data = data.copy()
         else:
diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py
index b954ce2584..69fce8cf21 100644
--- a/pandas/core/window/rolling.py
+++ b/pandas/core/window/rolling.py
@@ -881,10 +881,10 @@ class Window(BaseWindow):
     Parameters
     ----------
     window : int, timedelta, str, offset, or BaseIndexer subclass
-        Size of the moving window.
+        Interval of the moving window.
 
-        If an integer, the fixed number of observations used for
-        each window.
+        If an integer, the delta between the start and end of each window.
+        The number of points in the window depends on the ``closed`` argument.
 
         If a timedelta, str, or offset, the time period of each window. Each
         window will be a variable sized based on the observations included in
@@ -930,17 +930,18 @@ class Window(BaseWindow):
 
     closed : str, default None
         Determines the inclusivity of points in the window
-        If ``'right'``, (First, Last] the last point in the window
+
+        If ``'right'``, uses the window (first, last] meaning the last point
         is included in the calculations.
 
-        If ``'left'``, [First, Last) the first point in the window
+        If ``'left'``, uses the window [first, last) meaning the first point
         is included in the calculations.
 
-        If ``'both'``, [First, Last] all points in the window
-        are included in the calculations.
+        If ``'both'``, uses the window [first, last] meaning all points in
+        the window are included in the calculations.
 
-        If ``'neither'``, (First, Last) the first and last points
-        in the window are excludedfrom calculations.
+        If ``'neither'``, uses the window (first, last) meaning the first
+        and last points in the window are excluded from calculations.
 
         () and [] are referencing open and closed set
         notation respetively.


Test patch:
diff --git a/pandas/tests/series/test_constructors.py b/pandas/tests/series/test_constructors.py
index 69f42b5e42..a2be698c0e 100644
--- a/pandas/tests/series/test_constructors.py
+++ b/pandas/tests/series/test_constructors.py
@@ -90,6 +90,13 @@ class TestSeriesConstructors:
         with pytest.raises(ValueError, match=msg):
             Series(np.array(vals, dtype=object), dtype="datetime64[ns]")
 
+    def test_invalid_dtype_conversion_datetime_to_timedelta(self):
+        # GH#60728
+        vals = Series([NaT, Timestamp(2025, 1, 1)], dtype="datetime64[ns]")
+        msg = r"^Cannot cast DatetimeArray to dtype timedelta64\[ns\]$"
+        with pytest.raises(TypeError, match=msg):
+            Series(vals, dtype="timedelta64[ns]")
+
     @pytest.mark.parametrize(
         "constructor",
         [