Repository: PlasmaPy/PlasmaPy

Issue:
Reorganize and clean up `docs/conf.py`
Our Sphinx configuration for our documentation builds (`docs/conf.py`) is a bit cluttered, and contains some content that is no longer relevant (like for building pdfs via LaTeX, which we are not doing).  It would be worthwhile to remove the no-longer-needed content and reorganize the file so things are a bit easier to find.  

I'll assign myself to this since I hang out in this file more than I probably should.

Discussion:
namurphy: 
Also it appears that `pkg_resources` has been deprecated so I'll need to:

 - [ ] Create a separate PR for changing version stuff to use modern replacement for `pkg_resources`

github-actions[bot]: Thank you for submitting a pull request (PR) to PlasmaPy! ✨ The future of the project depends on contributors like you, so we deeply appreciate it! 🌱

  Our [**contributor guide**](https://docs.plasmapy.org/en/latest/contributing/index.html) has information on:

   - [Getting ready to contribute](https://docs.plasmapy.org/en/latest/contributing/getting_ready.html#getting-ready-to-contribute) and the [code contribution workflow](https://docs.plasmapy.org/en/latest/contributing/workflow.html#code-contribution-workflow)
   - Using [`astropy.units`](https://docs.plasmapy.org/en/latest/notebooks/getting_started/units.html#Using-Astropy-Units) and [`plasmapy.particles`](https://docs.plasmapy.org/en/latest/notebooks/getting_started/particles.html#Using-PlasmaPy-Particles)
   - [Coding tips and guidelines](https://docs.plasmapy.org/en/latest/contributing/coding_guide.html#coding-guide)
   - [Writing documentation](https://docs.plasmapy.org/en/latest/contributing/doc_guide.html#writing-documentation) (in [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#restructuredtext-primer) with [numpydoc style docstrings](https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard)).
   - [Writing tests](https://docs.plasmapy.org/en/latest/contributing/testing_guide.html#testing-guide) using [pytest](https://docs.pytest.org)
   - [Adding a changelog entry](https://docs.plasmapy.org/en/latest/contributing/changelog_guide.html#adding-a-changelog-entry) (needed except for minor changes)

  The bottom of this page shows several checks that are run for every PR. Don't worry if something broke! We break stuff all the time. 😺 Click on "Details" to learn why a check didn't pass. Please also feel free to ask for help. We do that all the time as well. 🌸 You can find us in our [**chat room**](https://docs.plasmapy.org/en/latest/contributing/coding_guide.html) or weekly [**community meeting**](https://www.plasmapy.org/meetings/weekly) & [**office hours**](https://www.plasmapy.org/meetings/office_hours). Here are some tips:

   - Try fixing **CI / Python 3.11** test failures first.
   - Most **pre-commit.ci - pr** failures can be automagically fixed by commenting `pre-commit.ci autofix` below, followed by a `git pull` to bring the changes back to your computer.
   - If **pre-commit.ci - pr** says that a function is too long or complex, try breaking up that function into multiple short functions that each do one thing. See also these tips on [**writing clean scientific software**](https://doi.org/10.5281/zenodo.3922956).
   - If the **CI / Documentation** check ends with a cryptic error message, check out our [documentation troubleshooting guide](https://docs.plasmapy.org/en/latest/contributing/doc_guide.html#troubleshooting).
   - For a documentation preview, click on *Details* next to **docs/readthedocs.org:plasmapy**.

  If this PR is marked as ready for review, someone should stop by to provide a code review and offer suggestions soon. ✅ If you don't get a review within a few days, please feel free to send us a reminder.

  Please also use SI units within PlasmaPy, except when there is strong justification otherwise or in some examples.

  We thank you once again!
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/PlasmaPy/PlasmaPy/pull/2363?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy) Report
All modified lines are covered by tests :white_check_mark:
> Comparison is base [(`335a082`)](https://app.codecov.io/gh/PlasmaPy/PlasmaPy/commit/335a082a1d2b23d8257d0cce4087f8e8da9dfd13?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy) 98.26% compared to head [(`2edf8f1`)](https://app.codecov.io/gh/PlasmaPy/PlasmaPy/pull/2363?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy) 98.26%.

<details><summary>Additional details and impacted files</summary>


```diff
@@           Coverage Diff           @@
##             main    #2363   +/-   ##
=======================================
  Coverage   98.26%   98.26%           
=======================================
  Files         102      102           
  Lines        8606     8606           
=======================================
  Hits         8457     8457           
  Misses        149      149           
```




</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/PlasmaPy/PlasmaPy/pull/2363?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy).

namurphy: pre-commit.ci autofix

Patch:
diff --git a/changelog/2300.bugfix.rst b/changelog/2300.bugfix.rst
new file mode 100644
index 00000000..891ccf08
--- /dev/null
+++ b/changelog/2300.bugfix.rst
@@ -0,0 +1,1 @@
+Enable ``time_step`` parameter in `~plasmapy.analysis.time_series.excess_statistics.ExcessStatistics` class to have a astropy unit.
diff --git a/changelog/2363.doc.rst b/changelog/2363.doc.rst
new file mode 100644
index 00000000..0b37fb93
--- /dev/null
+++ b/changelog/2363.doc.rst
@@ -0,0 +1,1 @@
+Refactored :file:`docs/conf.py` to improve organization.
diff --git a/docs/_global_substitutions.py b/docs/_global_substitutions.py
index 3e705fd8..6c215e3a 100644
--- a/docs/_global_substitutions.py
+++ b/docs/_global_substitutions.py
@@ -129,6 +129,7 @@
     "Numba": "https://numba.readthedocs.io",
     "NumPy": "https://numpy.org",
     "office hours": "https://www.plasmapy.org/meetings/office_hours/",
+    "pandas": "https://pandas.pydata.org",
     "pip": "https://pip.pypa.io",
     "Plasma Hack Week": "https://hack.plasmapy.org",
     "PlasmaPy": "https://www.plasmapy.org",
diff --git a/docs/conf.py b/docs/conf.py
index 34485d7a..4b51751f 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -15,10 +15,10 @@
 # isort: on
 
 import _cff_to_rst
+import pkg_resources  # deprecated
 
 from _global_substitutions import global_substitutions
 from datetime import datetime
-from pkg_resources import parse_version
 from sphinx.application import Sphinx
 
 # Generate author list from CITATION.cff
@@ -27,10 +27,20 @@
 
 from plasmapy import __version__ as release
 
-# -- General configuration ------------------------------------------------
+# Project metadata
 
-# Add Sphinx extension module names here. When extensions are removed or
-# added, please update the corresponding section in docs/doc_guide.rst.
+project = "PlasmaPy"
+author = "PlasmaPy Community"
+copyright = f"2015–{datetime.utcnow().year}, {author}"  # noqa: A001, DTZ003
+language = "en"
+
+release = "" if release == "unknown" else release
+parsed_version = pkg_resources.parse_version(release)  # deprecated
+release = parsed_version.public
+version = ".".join(release.split(".")[:2])  # short X.Y version
+revision = parsed_version.local[1:] if parsed_version.local is not None else ""
+
+# Sphinx configuration variables
 
 extensions = [
     "hoverxref.extension",
@@ -59,262 +69,24 @@
     "sphinxcontrib.globalsubs",
 ]
 
-# plasmapy_sphinx settings
-
-autosummary_generate = True
-automodapi_custom_groups = {
-    "aliases": {
-        "title": "Aliases",
-        "description": (
-            """
-            PlasmaPy provides :term:`aliases` of the most common plasma
-            functionality for user convenience. Aliases in PlasmaPy are
-            denoted with a trailing underscore (e.g., ``alias_``). For
-            further details, please refer to the :ref:`contributor
-            guide's section on aliases <aliases>`.
-            """
-        ),
-        "dunder": "__aliases__",
-    },
-    "lite-functions": {
-        "title": "Lite-Functions",
-        "description": (
-            """
-            :term:`Lite-functions` are optimized versions of existing
-            `plasmapy` functions that are intended for applications where
-            computational efficiency matters most. Lite-functions accept
-            numbers and NumPy arrays that are implicitly assumed to be
-            in SI units, and do not accept |Quantity| objects as inputs.
-            For further details, please refer to the :ref:`contributor
-            guide's section on lite-functions <lite-functions>`.
-
-            .. caution::
-
-               Lite-functions do not include the safeguards that are
-               included in most `plasmapy.formulary` functions. When
-               using lite-functions, it is vital to double-check your
-               implementation!
-            """
-        ),
-        "dunder": "__lite_funcs__",
-    },
-}
-automodapi_group_order = (
-    "modules",
-    "classes",
-    "exceptions",
-    "warnings",
-    "functions",
-    "aliases",
-    "lite-functions",
-    "variables",
-)
-
-# Configure sphinxcontrib-bibtex
-
-bibtex_bibfiles = ["bibliography.bib"]
-bibtex_default_style = "plain"
-bibtex_reference_style = "author_year"
-bibtex_cite_id = "{key}"
-
-# Configure sphinx-codeautolink
-
-codeautolink_concat_default = True
-
-# Intersphinx generates automatic links to the documentation of objects
-# in other packages. When mappings are removed or added, please update
-# the section in docs/doc_guide.rst on references to other packages.
-
-intersphinx_mapping = {
-    "astropy": ("https://docs.astropy.org/en/stable/", None),
-    "lmfit": ("https://lmfit.github.io/lmfit-py/", None),
-    "matplotlib": ("https://matplotlib.org/stable/", None),
-    "numba": ("https://numba.readthedocs.io/en/stable/", None),
-    "numpy": ("https://numpy.org/doc/stable/", None),
-    "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
-    "pytest": ("https://docs.pytest.org/en/stable/", None),
-    "python": ("https://docs.python.org/3/", None),
-    "readthedocs": ("https://docs.readthedocs.io/en/stable/", None),
-    "scipy": ("https://docs.scipy.org/doc/scipy/", None),
-    "sphinx": ("https://www.sphinx-doc.org/en/master/", None),
-    "sphinx_automodapi": (
-        "https://sphinx-automodapi.readthedocs.io/en/latest/",
-        None,
-    ),
-}
-
-hoverxref_intersphinx = [
-    "astropy",
-    "lmfit",
-    "numba",
-    "numpy",
-    "pandas",
-    "pytest",
-    "python",
-    "readthedocs",
-    "scipy",
-    "sphinx",
-    "sphinx_automodapi",
-]
-
-autoclass_content = "both"
-autodoc_typehints_format = "short"
-
-# Configure sphinx-issues
-
-issues_github_path = "PlasmaPy/PlasmaPy"
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ["_templates"]
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-#
-# source_suffix = ['.rst', '.md']
-source_suffix = ".rst"
-
-# The root toctree document.
-root_doc = "index"
-
-# General information about the project.
-project = "PlasmaPy"
-author = "PlasmaPy Community"
-copyright = f"2015–{datetime.utcnow().year}, {author}"  # noqa: A001, DTZ003
-language = "en"
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The full version, including alpha/beta/rc tags.
-#  Note: If plasmapy.__version__ can not be defined then it is set to 'unknown'.
-#        However, release needs to be a semantic style version number, so set
-#        the 'unknown' case to ''.
-release = "" if release == "unknown" else release
-pv = parse_version(release)
-release = pv.public
-version = ".".join(release.split(".")[:2])  # short X.Y version
-revision = pv.local[1:] if pv.local is not None else ""
-
-# The Sphinx configuration variables rst_prolog and rst_epilog contain
-# text that gets prepended or appended to all reStructuredText sources.
-# These variables can be used to make global definitions; however, long
-# values of these variables can greatly slow down the documentation
-# build, so use them in moderation!  Use docs/_global_substitutions.py
-# to define substitutions.
-
-rst_prolog = """
-.. role:: py(code)
-   :language: python
-
-.. role:: bash(code)
-   :language: bash
-"""
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This patterns also effect to html_static_path and html_extra_path
 exclude_patterns = [
-    "_build",
-    "Thumbs.db",
+    "**.ipynb_checkpoints",
+    "**Untitled*",
     ".DS_Store",
+    "_build",
     "notebooks/langmuir_samples",
-    "**.ipynb_checkpoints",
     "plasmapy_sphinx",
-    "**Untitled*",
+    "Thumbs.db",
 ]
 
-html_extra_path = ["robots.txt"]
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = False
-
 default_role = "py:obj"
-
-redirects = {
-    "contributing/install_dev": "../contributing/getting_ready.html",
-    "development": "../contributing/",
-    "development/changelog_guide": "../contributing/changelog_guide.html",
-    "development/code_guide": "../contributing/code_guide.html",
-    "development/doc_guide": "../contributing/doc_guide.html",
-    "development/index": "../contributing/index.html",
-    "development/install_dev": "../contributing/getting_ready.html",
-    "development/release_guide": "../contributing/release_guide.html",
-    "development/testing_guide": "../contributing/testing_guide.html",
-    "whatsnew": "../changelog/",
-    "whatsnew/0.1.0": "../changelog/0.1.0.html",
-    "whatsnew/0.1.1": "../changelog/0.1.0.html",
-    "whatsnew/0.2.0": "../changelog/0.1.0.html",
-    "whatsnew/0.3.1": "../changelog/0.1.0.html",
-    "whatsnew/0.4.0": "../changelog/0.1.0.html",
-    "whatsnew/0.5.0": "../changelog/0.1.0.html",
-    "whatsnew/0.6.0": "../changelog/0.1.0.html",
-    "whatsnew/0.7.0": "../changelog/0.1.0.html",
-    "whatsnew/0.8.1": "../changelog/0.1.0.html",
-    "whatsnew/0.9.0": "../changelog/0.1.0.html",
-    "whatsnew/0.9.1": "../changelog/0.1.0.html",
-    "whatsnew/2023.1.0": "../changelog/2023.1.0.html",
-    "whatsnew/index": "../changelog/index.html",
-}
-
-# Use a code highlighting style that meets the WCAG AA contrast standard
-pygments_style = "default"
-
-# adapted from sphinx-hoverxref conf.py
-if os.environ.get("READTHEDOCS"):
-    # Building on Read the Docs
-    hoverxref_api_host = "https://readthedocs.org"
-
-    if os.environ.get("PROXIED_API_ENDPOINT"):
-        # Use the proxied API endpoint
-        # - A RTD thing to avoid a CSRF block when docs are using a
-        #   custom domain
-        hoverxref_api_host = "/_"
-
-hoverxref_tooltip_maxwidth = 600  # RTD main window is 696px
-hoverxref_auto_ref = True
-hoverxref_mathjax = True
-hoverxref_sphinxtabs = True
-
-# hoverxref has to be applied to these
-hoverxref_domains = ["py", "cite"]
-hoverxref_roles = ["confval", "term"]
-
-hoverxref_role_types = {
-    # roles with cite domain
-    "p": "tooltip",
-    "t": "tooltip",
-    #
-    # roles with py domain
-    "attr": "tooltip",
-    "class": "tooltip",
-    "const": "tooltip",
-    "data": "tooltip",
-    "exc": "tooltip",
-    "func": "tooltip",
-    "meth": "tooltip",
-    "mod": "tooltip",
-    "obj": "tooltip",
-    #
-    # roles with std domain
-    "confval": "tooltip",
-    "hoverxref": "tooltip",
-    "ref": "tooltip",
-    "term": "tooltip",
-}
-
-# Using sphinx.ext.extlinks lets us simplify the process of creating
-# links to commonly used external sites. The key of the extlink becomes
-# a new role, and the corresponding tuple contains the base url and the
-# caption. For example, we can now do :orcid:`0000-0000-0000-0000` and
-# have a link create to the corresponding ORCID page. New roles should
-# be added to rst-roles in tox.ini to avoid being caught by
-# flake8-rst-docstrings.
-
-extlinks = {
-    "orcid": ("https://orcid.org/%s", "%s"),
-    "wikipedia": ("https://en.wikipedia.org/wiki/%s", "%s"),
-}
+html_extra_path = ["robots.txt"]
+html_favicon = "./_static/icon.ico"
+modindex_common_prefix = ["plasmapy."]
+pygments_style = "default"  # code highlighting style to meet WCAG AA contrast standard
+root_doc = "index"
+source_suffix = ".rst"
+templates_path = ["_templates"]
 
 # Specify patterns to ignore when doing a nitpicky documentation build.
 # These may include common expressions like "real number" as well as
@@ -393,108 +165,163 @@
     (python_role, "plasmapy.utils.decorators.lite_func"),
 ]
 
-# -- Options for HTML output ----------------------------------------------
+# The Sphinx configuration variables rst_prolog and rst_epilog contain
+# text that gets prepended or appended to all reStructuredText sources.
+# These variables can be used to make global definitions; however, long
+# values of these variables can greatly slow down the documentation
+# build, so use them in moderation!  Use docs/_global_substitutions.py
+# to define substitutions.
 
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-#
-html_theme = "sphinx_rtd_theme"
+rst_prolog = """
+.. role:: py(code)
+   :language: python
+"""
+
+# html output options
 
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#
 html_logo = "./_static/with-text-light-190px.png"
+html_static_path = ["_static"]
+html_theme = "sphinx_rtd_theme"
 html_theme_options = {
     "logo_only": True,
-    #
-    # TOC options
-    #   https://sphinx-rtd-theme.readthedocs.io/en/stable/configuring.html#theme-options
     "includehidden": False,
 }
+htmlhelp_basename = "PlasmaPydoc"
 
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ["_static"]
+# sphinx.ext.autodoc
 
-# A list of prefixes that are ignored for sorting the Python module
-# index (e.g., if this is set to ['foo.'], then foo.bar is shown under
-# B, not F).
-modindex_common_prefix = ["plasmapy."]
+autoclass_content = "both"
+autodoc_typehints_format = "short"
 
-# -- Options for HTMLHelp output ------------------------------------------
+# sphinxcontrib-bibtex
 
-# Output file base name for HTML help builder.
-htmlhelp_basename = "PlasmaPydoc"
+bibtex_bibfiles = ["bibliography.bib"]
+bibtex_default_style = "plain"
+bibtex_reference_style = "author_year"
+bibtex_cite_id = "{key}"
+
+# sphinx-codeautolink
+
+codeautolink_concat_default = True
+
+# intersphinx
 
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
-    # The paper size ('letterpaper' or 'a4paper').
-    # 'papersize': 'letterpaper',
-    #
-    # The font size ('10pt', '11pt' or '12pt').
-    # 'pointsize': '10pt',
-    #
-    # Additional stuff for the LaTeX preamble.
-    # 'preamble': '',
-    #
-    # Latex figure (float) alignment
-    # 'figure_align': 'htbp',
+intersphinx_mapping = {
+    "astropy": ("https://docs.astropy.org/en/stable/", None),
+    "lmfit": ("https://lmfit.github.io/lmfit-py/", None),
+    "matplotlib": ("https://matplotlib.org/stable/", None),
+    "numba": ("https://numba.readthedocs.io/en/stable/", None),
+    "numpy": ("https://numpy.org/doc/stable/", None),
+    "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
+    "pytest": ("https://docs.pytest.org/en/stable/", None),
+    "python": ("https://docs.python.org/3/", None),
+    "readthedocs": ("https://docs.readthedocs.io/en/stable/", None),
+    "scipy": ("https://docs.scipy.org/doc/scipy/", None),
+    "sphinx": ("https://www.sphinx-doc.org/en/master/", None),
+    "sphinx_automodapi": (
+        "https://sphinx-automodapi.readthedocs.io/en/latest/",
+        None,
+    ),
 }
 
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-#  author, documentclass [howto, manual, or own class]).
-latex_documents = [
-    (
-        root_doc,
-        "PlasmaPy.tex",
-        "PlasmaPy Documentation",
-        "PlasmaPy Community",
-        "manual",
-    )
-]
+# hoverxref
 
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [(root_doc, "plasmapy", "PlasmaPy Documentation", [author], 1)]
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-#  dir menu entry, description, category)
-texinfo_documents = [
-    (
-        root_doc,
-        "PlasmaPy",
-        "PlasmaPy Documentation",
-        author,
-        "PlasmaPy",
-        "Python package for plasma physics",
-        "Miscellaneous",
-    )
-]
+hoverxref_intersphinx = list(intersphinx_mapping.keys())
 
-html_favicon = "./_static/icon.ico"
+hoverxref_auto_ref = True
+hoverxref_domains = ["py", "cite"]
+hoverxref_mathjax = True
+hoverxref_roles = ["confval", "term"]
+hoverxref_sphinxtabs = True
+hoverxref_tooltip_maxwidth = 600  # RTD main window is 696px
+
+hoverxref_role_types = {
+    # roles with cite domain
+    "p": "tooltip",
+    "t": "tooltip",
+    # roles with py domain
+    "attr": "tooltip",
+    "class": "tooltip",
+    "const": "tooltip",
+    "data": "tooltip",
+    "exc": "tooltip",
+    "func": "tooltip",
+    "meth": "tooltip",
+    "mod": "tooltip",
+    "obj": "tooltip",
+    # roles with std domain
+    "confval": "tooltip",
+    "hoverxref": "tooltip",
+    "ref": "tooltip",
+    "term": "tooltip",
+}
 
-# Settings for checking hyperlinks with `make linkcheck`.
+if building_on_readthedocs := os.environ.get("READTHEDOCS"):
+    # Using the proxied API endpoint is a Read the Docs strategy to
+    # avoid a cross-site request forgery block for docs using a custom
+    # domain. See conf.py for sphinx-hoverxref.
+    use_proxied_api_endpoint = os.environ.get("PROXIED_API_ENDPOINT")
+    hoverxref_api_host = "/_" if use_proxied_api_endpoint else "https://readthedocs.org"
 
-# Regular expressions primer: https://docs.python.org/3/library/re.html
+# sphinx-issues
 
-linkcheck_anchors = True
+issues_github_path = "PlasmaPy/PlasmaPy"
+
+# sphinx.ext.todo
+
+todo_include_todos = False
+
+# sphinx_reredirects
 
+redirects = {
+    "contributing/install_dev": "../contributing/getting_ready.html",
+    "development": "../contributing/",
+    "development/changelog_guide": "../contributing/changelog_guide.html",
+    "development/code_guide": "../contributing/code_guide.html",
+    "development/doc_guide": "../contributing/doc_guide.html",
+    "development/index": "../contributing/index.html",
+    "development/install_dev": "../contributing/getting_ready.html",
+    "development/release_guide": "../contributing/release_guide.html",
+    "development/testing_guide": "../contributing/testing_guide.html",
+    "whatsnew": "../changelog/",
+    "whatsnew/0.1.0": "../changelog/0.1.0.html",
+    "whatsnew/0.1.1": "../changelog/0.1.0.html",
+    "whatsnew/0.2.0": "../changelog/0.1.0.html",
+    "whatsnew/0.3.1": "../changelog/0.1.0.html",
+    "whatsnew/0.4.0": "../changelog/0.1.0.html",
+    "whatsnew/0.5.0": "../changelog/0.1.0.html",
+    "whatsnew/0.6.0": "../changelog/0.1.0.html",
+    "whatsnew/0.7.0": "../changelog/0.1.0.html",
+    "whatsnew/0.8.1": "../changelog/0.1.0.html",
+    "whatsnew/0.9.0": "../changelog/0.1.0.html",
+    "whatsnew/0.9.1": "../changelog/0.1.0.html",
+    "whatsnew/2023.1.0": "../changelog/2023.1.0.html",
+    "whatsnew/index": "../changelog/index.html",
+}
+
+# Using sphinx.ext.extlinks lets us simplify the process of creating
+# links to commonly used external sites. The key of the extlink becomes
+# a new role, and the corresponding tuple contains the base url and the
+# caption. For example, we can now do :orcid:`0000-0000-0000-0000` and
+# have a link create to the corresponding ORCID page. New roles should
+# be added to rst-roles in tox.ini to avoid being caught by
+# flake8-rst-docstrings.
+
+extlinks = {
+    "orcid": ("https://orcid.org/%s", "%s"),
+    "wikipedia": ("https://en.wikipedia.org/wiki/%s", "%s"),
+}
+
+# Settings for checking hyperlinks with `make linkcheck`. For a primer
+# on regular expressions, see: https://docs.python.org/3/library/re.html
+
+linkcheck_anchors = True
 linkcheck_anchors_ignore = [
     "/room",
     r".+openastronomy.+",
     "L[0-9].+",
     "!forum/plasmapy",
 ]
-
 linkcheck_allowed_redirects = {
     r"https://doi\.org/.+": r"https://.+",  # DOI links are persistent
     r"https://docs.+\.org": r"https://docs.+\.org/en/.+",
@@ -511,13 +338,9 @@
     r"https://www\.python\.org/dev/peps/pep.+": r"https://peps\.python\.org/pep.+",
 }
 
-# Hyperlinks for `make linkcheck` to ignore. This may include:
-#
-#  - Stable links (i.e. DOI links that have been tested)
-#  - Links to domains that get repeatedly accessed by `make linkcheck`
-#    and are prone to 403 errors (i.e. some DOI links)
-#  - Links that require a login (i.e. from )
-#  - Links that require you to verify as human
+# Hyperlinks for `make linkcheck` to ignore. This may include stable
+# links (like DOIs), links prone to 403 errors, links requiring a login,
+# or links that require you to verify that you are a human.
 
 linkcheck_ignore = [
     r"https://agupubs\.onlinelibrary\.wiley\.com/doi/10\.1029/2012JA017856",
@@ -526,6 +349,7 @@
     r"https://doi\.org/10\.1007/978-3-319-67711-8.*",
     r"https://doi\.org/10\.1007/s11207-014-0526-6",
     r"https://doi\.org/10\.1007/s41116-019-0021-0",
+    r"https://doi\.org/10\.1016/0032-0633\(94\)00197-Y",
     r"https://doi\.org/10\.1016/c2009-0-20048-1",
     r"https://doi\.org/10\.1016/c2013-0-12176-9",
     r"https://doi\.org/10\.1016/j\.physleta\.2004\.08\.021",
@@ -599,10 +423,9 @@
     r"https://orcid\.org/0009-0009-9490-5284",
     r"https://www\.iter\.org/",
     r"https://www\.sciencedirect\.com/book/9780123748775/.*",
-    r"https://doi\.org/10\.1016/0032-0633\(94\)00197-Y",
 ]
 
-# -- NBSphinx options
+# nbsphinx
 
 nbsphinx_thumbnails = {
     "notebooks/*": "_static/graphic-circular.png",
@@ -654,6 +477,58 @@
     \sphinxcode{\sphinxupquote{\strut {{ docname | escape_latex }}}} \dotfill}}
 """
 
+# plasmapy_sphinx settings
+
+autosummary_generate = True
+automodapi_custom_groups = {
+    "aliases": {
+        "title": "Aliases",
+        "description": (
+            """
+            PlasmaPy provides :term:`aliases` of the most common plasma
+            functionality for user convenience. Aliases in PlasmaPy are
+            denoted with a trailing underscore (e.g., ``alias_``). For
+            further details, please refer to the :ref:`contributor
+            guide's section on aliases <aliases>`.
+            """
+        ),
+        "dunder": "__aliases__",
+    },
+    "lite-functions": {
+        "title": "Lite-Functions",
+        "description": (
+            """
+            :term:`Lite-functions` are optimized versions of existing
+            `plasmapy` functions that are intended for applications where
+            computational efficiency matters most. Lite-functions accept
+            numbers and NumPy arrays that are implicitly assumed to be
+            in SI units, and do not accept |Quantity| objects as inputs.
+            For further details, please refer to the :ref:`contributor
+            guide's section on lite-functions <lite-functions>`.
+
+            .. caution::
+
+               Lite-functions do not include the safeguards that are
+               included in most `plasmapy.formulary` functions. When
+               using lite-functions, it is vital to double-check your
+               implementation!
+            """
+        ),
+        "dunder": "__lite_funcs__",
+    },
+}
+
+automodapi_group_order = (
+    "modules",
+    "classes",
+    "exceptions",
+    "warnings",
+    "functions",
+    "aliases",
+    "lite-functions",
+    "variables",
+)
+
 
 def setup(app: Sphinx) -> None:
     app.add_config_value("revision", "", rebuild=True)
diff --git a/docs/contributing/doc_guide.rst b/docs/contributing/doc_guide.rst
index e9f61d86..3b80a635 100644
--- a/docs/contributing/doc_guide.rst
+++ b/docs/contributing/doc_guide.rst
@@ -1,8 +1,5 @@
 .. _documentation guide:
 
-.. role:: rest(code)
-   :language: rst
-
 *******************
 Documentation Guide
 *******************
@@ -12,6 +9,12 @@ Documentation Guide
    :local:
    :backlinks: none
 
+.. role:: bash(code)
+   :language: bash
+
+.. role:: rest(code)
+   :language: rst
+
 Introduction
 ============
 
@@ -36,8 +39,8 @@ PlasmaPy and affiliated packages.
 |PlasmaPy's documentation| is hosted by |Read the Docs| and is
 available at these locations:
 
-* The documentation corresponding to the most recent release to |PyPI| is
-  labeled ``stable`` and is found at https://docs.plasmapy.org or
+* The documentation corresponding to the most recent release to |PyPI|
+  is labeled ``stable`` and is found at https://docs.plasmapy.org or
   https://docs.plasmapy.org/en/stable.
 
 * The documentation corresponding to the ongoing development on the
@@ -63,20 +66,21 @@ Markup Languages
 ReStructuredText
 ----------------
 
-PlasmaPy's documentation is written using the |reStructuredText|
-markup language. |reStructuredText| is human readable when viewed within a source
-code file or when printed out using `help`. |reStructuredText| also contains markup
-that allows the text to be transformed into |PlasmaPy's documentation|.
-|reStructuredText| files use the file extension :file:`.rst`. Documentation contained
-within :file:`.py` files are in the form of :wikipedia:`docstrings
-<docstring>`, which are written in |reStructuredText|.
+PlasmaPy's documentation is written using the |reStructuredText| markup
+language. |reStructuredText| is human readable when viewed within a
+source code file or when printed out using `help`. |reStructuredText|
+also contains markup that allows the text to be transformed into
+|PlasmaPy's documentation|.  |reStructuredText| files use the file
+extension :file:`.rst`. Documentation contained within :file:`.py` files
+are in the form of :wikipedia:`docstrings <docstring>`, which are
+written in |reStructuredText|.
 
 ReStructuredText Examples
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Here we show some examples of commonly used |reStructuredText| syntax in PlasmaPy.
-Please refer to the documentation for |Sphinx| and |reStructuredText| for a list of
-available |roles| and |directives|.
+Here we show some examples of commonly used |reStructuredText| syntax in
+PlasmaPy.  Please refer to the documentation for |Sphinx| and
+|reStructuredText| for a list of available |roles| and |directives|.
 
 This is an example of including headings for the document title,
 sections, subsections, and so on. The lines surrounding each heading are
@@ -99,7 +103,7 @@ the same length as that heading.
 
 We can link to code objects by enclosing them in single backticks. This
 linking will work for |Python| objects as well as certain packages like
-|NumPy|, |SciPy|, |Astropy|, and pandas_. This linking is described in the
+|NumPy|, |SciPy|, |Astropy|, and |pandas|. This linking is described in the
 section on :ref:`external-references`. In-line code samples are
 typically enclosed in double backticks. To get inline code highlighting,
 use the :rest:`:py:` role for Python code or :rest:`:bash:` for code run
@@ -135,8 +139,8 @@ This |reStructuredText| block renders as:
    The ``:py:`` role can be used for inline code highlighting:
    :py:`import astropy.units as u`.
 
-|Sphinx| can format code blocks for |Python| and the |Python| console using
-the :rst:dir:`code-block` :term:`directive`.
+|Sphinx| can format code blocks for |Python| and the |Python| console
+using the :rst:dir:`code-block` :term:`directive`.
 
    .. code-block:: rst
 
@@ -216,10 +220,10 @@ Markdown
 
 A few of PlasmaPy's files are written using Markdown_, such as README
 files and licenses from other packages. Markdown_ is simpler but more
-limited than |reStructuredText|. Markdown_ files use the file extension :file:`.md`.
-Posts on GitHub are written in `GitHub Flavored Markdown`_. The
-following code block contains a few common examples of Markdown_
-formatting.
+limited than |reStructuredText|. Markdown_ files use the file extension
+:file:`.md`. Posts on GitHub are written in `GitHub Flavored
+Markdown`_. The following code block contains a few common examples of
+Markdown_ formatting.
 
 .. code-block:: markdown
 
@@ -249,11 +253,11 @@ Docstrings
 A :wikipedia:`docstring` is a comment at the beginning of a function or
 another object that provides information on how to use that function
 (see :pep:`257`). Docstrings are designated by surrounding the content
-with triple quotes ``"""This is my docstring."""``.
+with triple quotes :py:`"""This is my docstring."""`.
 
 In order to improve readability and maintain consistency, PlasmaPy uses
-the numpydoc_ standard for docstrings. Docstring conventions for |Python|
-are more generally described in :pep:`257`.
+the numpydoc_ standard for docstrings. Docstring conventions for
+|Python| are more generally described in :pep:`257`.
 
 .. tip::
 
@@ -653,9 +657,9 @@ Docstring guidelines
   a verb and should end with a period.
 
 * Keep the docstring indented at the same level as the ``r"""`` or
-  ``"""`` that begins the docstring, except for |reStructuredText| constructs like
-  lists, math, and code blocks. Use an indentation of four spaces more
-  than the declaration of the object.
+  ``"""`` that begins the docstring, except for |reStructuredText|
+  constructs like lists, math, and code blocks. Use an indentation of
+  four spaces more than the declaration of the object.
 
   .. code-block:: python
 
@@ -921,9 +925,9 @@ Sphinx
 ======
 
 |Sphinx| is the software used to generate |PlasmaPy's documentation|
-from |reStructuredText| files and |Python| docstrings. It was originally created to
-write Python's documentation and has become the de facto software for
-documenting |Python| packages. Almost all |Python| open-source packages
+from |reStructuredText| files and |Python| docstrings. It was originally
+created to write Python's documentation and has become the de facto
+software for documenting |Python| packages. Most |Python| packages
 utilize |Sphinx| to generate their documentation.
 
 Configuration
@@ -990,17 +994,17 @@ will show up as `astropy.units.Quantity` with a link to the appropriate
 page in Astropy documentation. Similarly, ```~astropy.units.Quantity```
 will show up as `~astropy.units.Quantity`.
 
-To make cross-referencing to an external package available its mappings
-have to be defined in the :confval:`intersphinx_mapping` configuration
-dictionary contained in |docs/conf.py|_. PlasmaPy has already include
-several packages like |Python|, |NumPy|, |SciPy|, |Astropy|, |Sphinx|, etc.
+The external packages that we can cross-reference via the magic of
+`~sphinx.ext.intersphinx` are defined in :confval:`intersphinx_mapping`
+in |docs/conf.py|_. Intersphinx has already been set up in PlasmaPy to
+include the central |Python| documentation, as well as frequently used
+packages such as |Astropy|, |lmfit|, |matplotlib|, |NumPy|, |pandas|,
+|SciPy|, and |Sphinx|.
 
-New source packages may be added, but please verify that references to a
-function or class in that package show up correctly in
-|PlasmaPy's documentation|. The name of the package does not always link as
-expected.
+.. tip::
 
-.. hint::
+   When adding new packages to :confval:`intersphinx_mapping`, please
+   double check that the configuration has been set up correctly.
 
    If a cross-link is not working as expected this is usually due to one
    of the following reasons:
@@ -1010,6 +1014,9 @@ expected.
    * The referenced source package not properly or fully indexing their
      own code, which is common in |Python| packages.
 
+   For some packages, the name of the package itself does not link
+   correctly.
+
 .. _substitutions:
 
 Substitutions
@@ -1047,10 +1054,10 @@ Bibliography
 ------------
 
 PlasmaPy uses |sphinxcontrib-bibtex|_ to manage references for its
-documentation. This |Sphinx| extension allows us to store references in a
-BibTeX_ file which is then used to generate the :doc:`../bibliography`.
-References in the :doc:`../bibliography` are then citeable from anywhere
-in the documentation.
+documentation. This |Sphinx| extension allows us to store references in
+a BibTeX_ file which is then used to generate the
+:doc:`../bibliography`.  References in the :doc:`../bibliography` are
+then citeable from anywhere in the documentation.
 
 To add a new reference to the :doc:`../bibliography`, open
 |docs/bibliography.bib|_ and add the reference in `BibTeX format`_. The
@@ -1139,9 +1146,9 @@ Building documentation
 
 .. tip::
 
-   Because a documentation preview is generated automatically by
-   |Read the Docs| for every pull request, it is not necessary to build
-   the documentation locally on your own computer. New contributors can
+   Because a documentation preview is generated automatically by |Read
+   the Docs| for every pull request, it is not necessary to build the
+   documentation locally on your own computer. New contributors can
    safely skip this section.
 
 There are two methods for building the documentation: make_ and |tox|.
@@ -1150,8 +1157,8 @@ There are two methods for building the documentation: make_ and |tox|.
   current directory structure. make_ is quicker for local builds than
   |tox| but requires you to install and set up all dependencies.
 
-* Using |tox| does not require setting up all dependencies ahead of time,
-  but is more computationally intensive since it creates a virtual
+* Using |tox| does not require setting up all dependencies ahead of
+  time, but is more computationally intensive since it creates a virtual
   environment and builds the package before building the documentation.
   Consequently, PlasmaPy uses |tox| for building the documentation on
   continuous integration testing platforms.
@@ -1185,15 +1192,15 @@ entering the :file:`docs/` directory and running:
 
    make html
 
-Including the :samp:`-j {n}` flag in the ``make`` command will enable a
-parallel build, where :samp:`{n}` is replaced with the number of
-processes or ``auto``. To skip building example notebooks, use ``make
-html-nonb`` instead.
+Including the :samp:`-j {n}` flag in the :bash:`make` command will
+enable a parallel build, where :samp:`{n}` is replaced with the number
+of processes or :bash:`auto`. To skip building example notebooks, use
+:bash:`make html-nonb` instead.
 
 You can access the documentation landing page by opening
 :file:`docs/_build/html/index.html` with your browser of choice.
 
-To remove all files previously generated by ``make``, run:
+To remove all files previously generated by :bash:`make`, run:
 
 .. code-block:: bash
 
@@ -1201,8 +1208,8 @@ To remove all files previously generated by ``make``, run:
 
 This command is needed when you make a change to a file that does not
 trigger |Sphinx| to rebuild the file that you altered, for example
-modifying a CSS_ file. Using ``make clean-api`` instead will only remove
-the :wikipedia:`API` portion of the documentation build.
+modifying a CSS_ file. Using :bash:`make clean-api` instead will only
+remove the :wikipedia:`API` portion of the documentation build.
 
 To check that hyperlinks are correct, run:
 
@@ -1247,8 +1254,9 @@ This command will build the documentation without executing the
 .. tip::
 
    When writing documentation, please make sure to fix any warnings that
-   arise. To enforce this, the ``build_docs`` |tox| environment will fail
-   after completing the documentation build if there are any warnings.
+   arise. To enforce this, the ``build_docs`` |tox| environment will
+   fail after completing the documentation build if there are any
+   warnings.
 
 Troubleshooting
 ===============
@@ -1277,8 +1285,8 @@ typo and changing it to ```plasmapy.particles```.
 
 .. important::
 
-   For PlasmaPy objects, use the full namespace of the object (i.e.,
-   use ```plasmapy.particles.particle_class.Particle``` instead of
+   For PlasmaPy objects, use the full namespace of the object (i.e., use
+   ```plasmapy.particles.particle_class.Particle``` instead of
    ```plasmapy.particles.Particle```) or a :ref:`reStructuredText
    substitution <substitutions>` like ``|Particle|`` as defined in
    |docs/_global_substitutions.py|_.
@@ -1313,16 +1321,16 @@ error or missing documentation pages.
 Missing attribute errors
 ------------------------
 
-An `AttributeError` may occur when an ``import`` statement is missing in
-a :file:`__init__.py` file. For example, the error
+An `AttributeError` may occur when an :py:`import` statement is missing
+in a :file:`__init__.py` file. For example, the error
 
 .. code-block::
 
    AttributeError: module 'plasmapy.subpackage' has no attribute 'module'
 
 will occur when :file:`plasmapy/subpackage/__init__.py` is missing
-:py:`from plasmapy.subpackage import module`. Make sure that ``__all__``
-contains ``"module"`` as well.
+:py:`from plasmapy.subpackage import module`. Make sure that
+:py:`__all__` contains :py:`"module"` as well.
 
 List ends without a blank line
 ------------------------------
@@ -1342,8 +1350,8 @@ a blank line and follows the formatting described in `Sphinx's
 documentation on lists`_.
 
 This warning may occur in other places due to an indentation or other
-formatting problem. Try checking out the formatting in the
-:ref:`example docstring` above.
+formatting problem. Try checking out the formatting in the :ref:`example
+docstring` above.
 
 This warning can occur when a changelog entry contains lines that start
 with a backtick. Try editing each changelog entry so that it is on a
@@ -1356,10 +1364,10 @@ single really long line, rewording the changelog entry, or using
 Could not match a code example to HTML
 --------------------------------------
 
-This warning occurs when `sphinx-codeautolink`_ cannot match a
-code object to its corresponding documentation. Double check that the
-code is correct, and consider adding any missing :py:`import`
-statements. The documentation for this extension contains `examples
+This warning occurs when `sphinx-codeautolink`_ cannot match a code
+object to its corresponding documentation. Double check that the code is
+correct, and consider adding any missing :py:`import` statements. The
+documentation for this extension contains `examples
 <https://sphinx-codeautolink.readthedocs.io/en/latest/examples.html>`__
 on how to skip blocks with ``.. autolink-skip::`` and how to do
 invisible imports with ``.. autolink-preface::``.
@@ -1398,8 +1406,8 @@ version of the package that can be revisited later.
 Document isn't included in any toctree
 --------------------------------------
 
-In general, each source file in the documentation must be included in
-a table of contents (toctree_). Otherwise, Sphinx_ will issue a warning
+In general, each source file in the documentation must be included in a
+table of contents (toctree_). Otherwise, Sphinx_ will issue a warning
 like:
 
 .. code-block::
@@ -1414,7 +1422,7 @@ This warning can be resolved by:
 * Adding the file to the appropriate toctree (see Sphinx's
   `documentation page on tables of contents <toctree>`_), or
 
-* Adding the ``:orphan:`` `metadata field`_ at the top of the file (not
+* Adding the ``orphan`` `metadata field`_ at the top of the file (not
   recommended in most situations).
 
 In the :file:`docs/` folder, the tables of contents are generally
@@ -1448,7 +1456,6 @@ For example Jupyter notebooks, the tables of contents are in
 .. _numpydoc: https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
 .. _options to sphinx-build: https://www.sphinx-doc.org/en/master/man/sphinx-build.html#options
 .. _packages related to Sphinx: https://pypi.org/search/?q=sphinx+or+nbsphinx&o=-created&c=Framework+%3A%3A+Sphinx
-.. _pandas: https://pandas.pydata.org
 .. _parameters: https://numpydoc.readthedocs.io/en/latest/format.html#parameters
 .. _raise an issue: https://github.com/PlasmaPy/PlasmaPy/issues/new?title=Improve+documentation+for...&labels=Documentation
 .. _raise an issue about the documentation build failure: https://github.com/PlasmaPy/PlasmaPy/issues/new?title=Documentation+build+failure&labels=Documentation
diff --git a/docs/contributing/getting_ready.rst b/docs/contributing/getting_ready.rst
index f0f6cda4..b3627383 100644
--- a/docs/contributing/getting_ready.rst
+++ b/docs/contributing/getting_ready.rst
@@ -9,6 +9,9 @@ Getting Ready to Contribute
    :local:
    :backlinks: none
 
+.. role:: bash(code)
+   :language: bash
+
 Introduction
 ============
 
diff --git a/docs/contributing/workflow.rst b/docs/contributing/workflow.rst
index 749ee616..6befa230 100644
--- a/docs/contributing/workflow.rst
+++ b/docs/contributing/workflow.rst
@@ -9,6 +9,9 @@ Code Contribution Workflow
    :local:
    :backlinks: none
 
+.. role:: bash(code)
+   :language: bash
+
 Introduction
 ============
 
diff --git a/plasmapy/analysis/time_series/excess_statistics.py b/plasmapy/analysis/time_series/excess_statistics.py
index 780b87c1..32bc2a29 100644
--- a/plasmapy/analysis/time_series/excess_statistics.py
+++ b/plasmapy/analysis/time_series/excess_statistics.py
@@ -9,6 +9,7 @@
 __all__ = ["ExcessStatistics"]
 
 
+import astropy.units as u
 import numbers
 import numpy as np
 
@@ -98,6 +99,9 @@ def _calculate_excess_statistics(self, signal, thresholds, time_step):
                     time_step * len(event_lengths[i]) for i in range(len(event_lengths))
                 ]
 
+                if isinstance(time_step, u.Quantity):
+                    self._times_above_threshold *= time_step.unit
+
                 self._number_of_crossings.append(len(event_lengths))
                 if indices_above_threshold[0] == 0:
                     # Don't count the first event if there is no crossing.
diff --git a/requirements.txt b/requirements.txt
index 5dcdb210..231615b7 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -45,7 +45,9 @@ beautifulsoup4==4.12.2
 bleach==6.1.0
     # via nbconvert
 cachecontrol[filecache]==0.13.1
-    # via sphinx-toolbox
+    # via
+    #   cachecontrol
+    #   sphinx-toolbox
 cachetools==5.3.1
     # via tox
 certifi==2023.7.22
@@ -72,7 +74,7 @@ comm==0.1.4
     #   ipywidgets
 contourpy==1.1.1
     # via matplotlib
-cssutils==2.7.1
+cssutils==2.9.0
     # via dict2css
 cycler==0.12.1
     # via matplotlib
@@ -121,11 +123,11 @@ fqdn==1.5.1
     # via jsonschema
 future==0.18.3
     # via uncertainties
-h5py==3.9.0
+h5py==3.10.0
     # via plasmapy (setup.py)
 html5lib==1.1
     # via sphinx-toolbox
-hypothesis==6.87.3
+hypothesis==6.88.0
     # via plasmapy (setup.py)
 identify==2.5.30
     # via pre-commit
@@ -175,13 +177,13 @@ jsonschema[format-nongpl]==4.19.1
     #   nbformat
 jsonschema-specifications==2023.7.1
     # via jsonschema
-jupyter-client==8.3.1
+jupyter-client==8.4.0
     # via
     #   ipykernel
     #   jupyter-server
     #   nbclient
     #   voila
-jupyter-core==5.3.2
+jupyter-core==5.4.0
     # via
     #   ipykernel
     #   jupyter-client
@@ -190,9 +192,9 @@ jupyter-core==5.3.2
     #   nbconvert
     #   nbformat
     #   voila
-jupyter-events==0.7.0
+jupyter-events==0.8.0
     # via jupyter-server
-jupyter-server==2.7.3
+jupyter-server==2.8.0
     # via
     #   jupyterlab-server
     #   voila
@@ -297,7 +299,7 @@ pexpect==4.8.0
     # via ipython
 pickleshare==0.7.5
     # via ipython
-pillow==10.0.1
+pillow==10.1.0
     # via
     #   matplotlib
     #   plasmapy (setup.py)
@@ -311,13 +313,13 @@ pluggy==1.3.0
     # via
     #   pytest
     #   tox
-pre-commit==3.4.0
+pre-commit==3.5.0
     # via plasmapy (setup.py)
 prometheus-client==0.17.1
     # via jupyter-server
 prompt-toolkit==3.0.39
     # via ipython
-psutil==5.9.5
+psutil==5.9.6
     # via ipykernel
 ptyprocess==0.7.0
     # via
@@ -333,7 +335,7 @@ pybtex-docutils==1.0.3
     # via sphinxcontrib-bibtex
 pycparser==2.21
     # via cffi
-pyerfa==2.0.0.3
+pyerfa==2.0.1
     # via astropy
 pygments==2.16.1
     # via
@@ -401,7 +403,7 @@ rfc3986-validator==0.1.1
     # via
     #   jsonschema
     #   jupyter-events
-rpds-py==0.10.4
+rpds-py==0.10.6
     # via
     #   jsonschema
     #   referencing


Test patch:
diff --git a/plasmapy/analysis/time_series/tests/test_excess_statistics.py b/plasmapy/analysis/time_series/tests/test_excess_statistics.py
index a38c1e57..943c4f52 100644
--- a/plasmapy/analysis/time_series/tests/test_excess_statistics.py
+++ b/plasmapy/analysis/time_series/tests/test_excess_statistics.py
@@ -18,6 +18,14 @@
             32,
             ([1], [1], [1], [0]),
         ),
+        (
+            [0, 2, 0],
+            1,
+            1 * u.s,
+            False,
+            32,
+            ([1] * u.s, [1], [1] * u.s, [0] * u.s),
+        ),
         (
             [0, 2, 0],
             1,