diff --git a/doc/_static/style.css b/doc/_static/style.css
index 7257d57db66..b7d30f429cf 100644
--- a/doc/_static/style.css
+++ b/doc/_static/style.css
@@ -16,3 +16,12 @@
.wy-nav-top {
background-color: #555;
}
+
+table.colwidths-given {
+ table-layout: fixed;
+ width: 100%;
+}
+table.docutils td {
+ white-space: unset;
+ word-wrap: break-word;
+}
diff --git a/doc/howdoi.rst b/doc/howdoi.rst
new file mode 100644
index 00000000000..721d1323e73
--- /dev/null
+++ b/doc/howdoi.rst
@@ -0,0 +1,59 @@
+.. currentmodule:: xarray
+
+.. _howdoi:
+
+How do I ...
+============
+
+.. list-table::
+ :header-rows: 1
+ :widths: 40 60
+
+ * - How do I...
+ - Solution
+ * - add variables from other datasets to my dataset
+ - :py:meth:`Dataset.merge`
+ * - add a new dimension and/or coordinate
+ - :py:meth:`DataArray.expand_dims`, :py:meth:`Dataset.expand_dims`
+ * - add a new coordinate variable
+ - :py:meth:`DataArray.assign_coords`
+ * - change a data variable to a coordinate variable
+ - :py:meth:`Dataset.set_coords`
+ * - change the order of dimensions
+ - :py:meth:`DataArray.transpose`, :py:meth:`Dataset.transpose`
+ * - remove a variable from my object
+ - :py:meth:`Dataset.drop`, :py:meth:`DataArray.drop`
+ * - remove dimensions of length 1 or 0
+ - :py:meth:`DataArray.squeeze`, :py:meth:`Dataset.squeeze`
+ * - remove all variables with a particular dimension
+ - :py:meth:`Dataset.drop_dims`
+ * - convert non-dimension coordinates to data variables or remove them
+ - :py:meth:`DataArray.reset_coords`, :py:meth:`Dataset.reset_coords`
+ * - rename a variable, dimension or coordinate
+ - :py:meth:`Dataset.rename`, :py:meth:`DataArray.rename`, :py:meth:`Dataset.rename_vars`, :py:meth:`Dataset.rename_dims`,
+ * - convert a DataArray to Dataset or vice versa
+ - :py:meth:`DataArray.to_dataset`, :py:meth:`Dataset.to_array`
+ * - extract the underlying array (e.g. numpy or Dask arrays)
+ - :py:attr:`DataArray.data`
+ * - convert to and extract the underlying numpy array
+ - :py:attr:`DataArray.values`
+ * - find out if my xarray object is wrapping a Dask Array
+ - :py:func:`dask.is_dask_collection`
+ * - know how much memory my object requires
+ - :py:attr:`DataArray.nbytes`, :py:attr:`Dataset.nbytes`
+ * - convert a possibly irregularly sampled timeseries to a regularly sampled timeseries
+ - :py:meth:`DataArray.resample`, :py:meth:`Dataset.resample` (see :ref:`resampling` for more)
+ * - apply a function on all data variables in a Dataset
+ - :py:meth:`Dataset.apply`
+ * - write xarray objects with complex values to a netCDF file
+ - :py:func:`Dataset.to_netcdf`, :py:func:`DataArray.to_netcdf` specifying ``engine="h5netcdf", invalid_netcdf=True``
+ * - make xarray objects look like other xarray objects
+ - :py:func:`~xarray.ones_like`, :py:func:`~xarray.zeros_like`, :py:func:`~xarray.full_like`, :py:meth:`Dataset.reindex_like`, :py:meth:`Dataset.interpolate_like`, :py:meth:`Dataset.broadcast_like`, :py:meth:`DataArray.reindex_like`, :py:meth:`DataArray.interpolate_like`, :py:meth:`DataArray.broadcast_like`
+ * - replace NaNs with other values
+ - :py:meth:`Dataset.fillna`, :py:meth:`Dataset.ffill`, :py:meth:`Dataset.bfill`, :py:meth:`Dataset.interpolate_na`, :py:meth:`DataArray.fillna`, :py:meth:`DataArray.ffill`, :py:meth:`DataArray.bfill`, :py:meth:`DataArray.interpolate_na`
+ * - extract the year, month, day or similar from a DataArray of time values
+ - ``obj.dt.month`` for example where ``obj`` is a :py:class:`~xarray.DataArray` containing ``datetime64`` or ``cftime`` values. See :ref:`dt_accessor` for more.
+ * - round off time values to a specified frequency
+ - ``obj.dt.ceil``, ``obj.dt.floor``, ``obj.dt.round``. See :ref:`dt_accessor` for more.
+ * - make a mask that is ``True`` where an object contains any of the values in a array
+ - :py:meth:`Dataset.isin`, :py:meth:`DataArray.isin`
diff --git a/doc/index.rst b/doc/index.rst
index 4cf67a37f4c..e5bd03801ff 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -84,6 +84,7 @@ Documentation
**Help & reference**
* :doc:`whats-new`
+* :doc:`howdoi`
* :doc:`api`
* :doc:`internals`
* :doc:`roadmap`
@@ -96,6 +97,7 @@ Documentation
:caption: Help & reference
whats-new
+ howdoi
api
internals
roadmap
diff --git a/doc/time-series.rst b/doc/time-series.rst
index e198887dd0d..1cb535ea886 100644
--- a/doc/time-series.rst
+++ b/doc/time-series.rst
@@ -101,6 +101,8 @@ You can also select a particular time by indexing with a
For more details, read the pandas documentation.
+.. _dt_accessor:
+
Datetime components
-------------------
diff --git a/doc/whats-new.rst b/doc/whats-new.rst
index 33410f82c2c..f9c952f6752 100644
--- a/doc/whats-new.rst
+++ b/doc/whats-new.rst
@@ -33,7 +33,8 @@ Documentation
- Created a glossary of important xarray terms (:issue:`2410`, :pull:`3352`).
By `Gregory Gundersen `_.
-
+- Created a "How do I..." section (:ref:`howdoi`) for solutions to common questions. (:pull:`3357`).
+ By `Deepak Cherian `_.
- Add examples for :py:meth:`Dataset.swap_dims` and :py:meth:`DataArray.swap_dims`.
By `Justus Magin `_.
- Add examples for :py:meth:`align`, :py:meth:`merge`, :py:meth:`combine_by_coords`,