Repository: PlasmaPy/PlasmaPy

Issue:
Add period, group, block, and category for each element
Each element in the periodic table has a [_period_](https://en.wikipedia.org/wiki/Period_(periodic_table)) and a [_group_](https://en.wikipedia.org/wiki/Group_(periodic_table)) related to its chemical properties.  Each row in the periodic table corresponds to a period, whereas each column corresponds to a group.  For example: lithium is in period 2, group 1 and helium is in period 2, group 18.  Elements of the same group have similar chemical properties.  The periodic table contains four [_blocks_](https://en.wikipedia.org/wiki/Block_(periodic_table)) ('s', 'p', 'd', and 'f') named after characteristic orbitals.  Additionally, there are different [categories](https://en.wikipedia.org/wiki/Names_for_sets_of_chemical_elements).  For example, the [periodic table from LANL](http://periodic.lanl.gov/index.shtml) uses the following categories: alkali metal, alkaline earth metal, transition metal, post-transition metal, metalloid, lanthanide, actinide, nonmetal, halogen, noble gas (see also the [IUPAC recommendations for nomenclature of inorganic chemistry from 2005](http://old.iupac.org/publications/books/rbook/Red_Book_2005.pdf)).  

I propose that we add functionality to get period, group, block, and category information for each element as an enhancement for the atomic subpackage.  The steps to do this are:

 - [ ] Add period information to `Elements` dictionary
 - [ ] Add group information to `Elements` dictionary
 - [ ] Add block information to `Elements` dictionary
 - [ ] Add category information to `Elements` dictionary
 - [ ] Create a function to retrieve an element's period (perhaps `periodic_table_period`)
 - [ ] Create a function to retrieve an element's group (perhaps `periodic_table_group`)
 - [ ] Create a function to retrieve an element's block (perhaps `periodic_table_block`)
 - [ ] Create a function to retrieve an element's category (perhaps `periodic_table_category`)

The `Elements` dictionary is in [`plasmapy/atomic/elements.py`](https://github.com/PlasmaPy/PlasmaPy/blob/master/plasmapy/atomic/elements.py).  Each function should have a docstring and tests.  Different function names would be fine if you can think of something more readable.  I did notice some differences in categories from different references, so it'd probably be best to cite what reference we use to get the category information.

Thank you! 🔬 🔭 

Cross-references because I know too many librarians: #52, #104, #105 


Discussion:
Also, there are too few emoji available on GitHub that are related to chemistry.
I think I can help with this, mind if I give it a crack?
Hey @jams2, sure! I'm sure @namurphy would appreciate some help with this. Make sure to coordinate though!

Resolving patch:
diff --git a/plasmapy/atomic/atomic.py b/plasmapy/atomic/atomic.py
--- a/plasmapy/atomic/atomic.py
+++ b/plasmapy/atomic/atomic.py
@@ -7,7 +7,7 @@
 from astropy import units as u, constants as const
 from astropy.units import Quantity
 
-from .elements import _Elements
+from .elements import _Elements, _atomic_symbols_dict, _atomic_symbols
 from .isotopes import _Isotopes
 
 from ..utils import (
@@ -1257,3 +1257,213 @@ def stable_isotopes_for_element(argument: Union[str, int],
                 stable_isotopes_for_element(atomic_numb, not unstable)
 
     return isotopes_list
+
+
+def periodic_table_period(argument: Union[str, int]) -> int:
+    r"""Returns the periodic table period.
+
+    Parameters
+    ----------
+
+    argument: string or integer
+        Atomic number (either integer or string), atomic symbol (e.g. "H",
+        string), or element name (e.g. "Francium", string).
+
+    Returns
+    -------
+
+    period: integer
+        The the periodic table period of the element.
+
+    Raises
+    ------
+
+    TypeError:
+        If the argument is not a string or integer.
+
+    See also
+    --------
+
+        periodic_table_group : returns periodic table group of element.
+        periodic_table_block : returns periodic table block of element.
+
+    Examples
+    --------
+
+    >>> periodic_table_period(5)
+    2
+    >>> periodic_table_period("5")
+    2
+    >>> periodic_table_period("Au")
+    6
+    >>> periodic_table_period("nitrogen")
+    2
+    >>> periodic_table_period("Nitrogen")
+    2
+
+    """
+    if not isinstance(argument, (str, int)):
+        raise TypeError("The argument to periodic_table_period must be " +
+                        "either a string representing the element or its " +
+                        "symbol, or an integer representing its atomic " +
+                        "number.")
+    symbol = atomic_symbol(argument)
+    period = _Elements[symbol]["period"]
+    return period
+
+
+def periodic_table_group(argument: Union[str, int]) -> int:
+    r"""Returns the periodic table group.
+
+    Parameters
+    ----------
+
+    argument: string or integer
+        Atomic number (either integer or string), atomic symbol (e.g. "H",
+        string), or element name (e.g. "Francium", string).
+
+    Returns
+    -------
+
+    group: integer
+        The periodic table group of the element.
+
+    Raises
+    ------
+
+    TypeError:
+        If the argument is not a string or integer.
+
+    See also
+    --------
+
+        periodic_table_period : returns periodic table period of element.
+        periodic_table_block : returns periodic table block of element.
+
+    Examples
+    --------
+
+    >>> periodic_table_group(18)
+    18
+    >>> periodic_table_group("24")
+    6
+    >>> periodic_table_group("Al")
+    13
+    >>> periodic_table_group("neon")
+    18
+    >>> periodic_table_group("BARIUM")
+    2
+
+    """
+    if not isinstance(argument, (str, int)):
+        raise TypeError("The argument to periodic_table_group must be " +
+                        "either a string representing the element or its " +
+                        "symbol, or an integer representing its atomic " +
+                        "number.")
+    symbol = atomic_symbol(argument)
+    group = _Elements[symbol]["group"]
+    return group
+
+
+def periodic_table_block(argument: Union[str, int]) -> str:
+    r"""Returns the periodic table block.
+
+    Parameters
+    ----------
+
+    argument: string or integer
+        Atomic number (either integer or string), atomic symbol (e.g. "H",
+        string), or element name (e.g. "Francium", string).
+
+    Returns
+    -------
+
+    block: string
+        The periodic table block of the element.
+
+    Raises
+    ------
+
+    TypeError:
+        If the argument is not a string or integer.
+
+    See also
+    --------
+
+        periodic_table_period: returns periodic table period of element.
+        periodic_table_group: returns periodic table group of element.
+
+    Examples
+    --------
+
+    >>> periodic_table_block(66)
+    'f'
+    >>> periodic_table_block("72")
+    'd'
+    >>> periodic_table_block("Tl")
+    'p'
+    >>> periodic_table_block("thallium")
+    'p'
+    >>> periodic_table_block("FRANCIUM")
+    's'
+
+    """
+    if not isinstance(argument, (str, int)):
+        raise TypeError("The argument to periodic_table_block must be " +
+                        "either a string representing the element or its " +
+                        "symbol, or an integer representing its atomic " +
+                        "number.")
+    symbol = atomic_symbol(argument)
+    block = _Elements[symbol]["block"]
+    return block
+
+
+def periodic_table_category(argument: Union[str, int]) -> str:
+    r"""Returns the periodic table category.
+
+    Parameters
+    ----------
+
+    argument: string or integer
+        Atomic number (either integer or string), atomic symbol (e.g. "H",
+        string), or element name (e.g. "Francium", string).
+
+    Returns
+    -------
+
+    category: string
+        The periodic table category of the element.
+
+    Raises
+    ------
+
+    TypeError:
+        If the argument is not a string or integer.
+
+    See also
+    --------
+
+        periodic_table_period: returns periodic table period of element.
+        periodic_table_group: returns periodic table group of element.
+
+    Examples
+    --------
+
+    >>> periodic_table_category(82)
+    'Post-transition metals'
+    >>> periodic_table_category("85")
+    'Halogens'
+    >>> periodic_table_category("Ra")
+    'Alkaline earth metals'
+    >>> periodic_table_category("rhodium")
+    'Transition metals'
+
+    """
+    if not isinstance(argument, (str, int)):
+        raise TypeError("The argument to periodic_table_category must be " +
+                        "either a string representing the element or its " +
+                        "symbol, or an integer representing its atomic " +
+                        "number.")
+    symbol = atomic_symbol(argument)
+    category = _Elements[symbol]["category"]
+    return category
diff --git a/plasmapy/atomic/elements.py b/plasmapy/atomic/elements.py
--- a/plasmapy/atomic/elements.py
+++ b/plasmapy/atomic/elements.py
@@ -1,4 +1,8 @@
-"""Dictionaries containing atomic data"""
+"""
+Dictionaries containing atomic data
+Periodic table data from http://periodic.lanl.gov/index.shtml
+
+"""
 
 from astropy import units as u, constants as const
 
@@ -73,239 +77,357 @@
 
 _Elements = {
     "H": {"atomic_number": 1, "symbol": "H",
-          "atomic_mass": 1.008*u.u, "name": "hydrogen"},
+          "atomic_mass": 1.008*u.u, "name": "hydrogen", "period": 1,
+          "group": 1, "block": "s", "category": "Nonmetals"},
     "He": {"atomic_number": 2, "symbol": "He",
-           "atomic_mass": 4.002602*u.u, "name": "helium"},
+           "atomic_mass": 4.002602*u.u, "name": "helium", "period": 1,
+           "group": 18, "block": "s", "category": "Noble gases"},
     "Li": {"atomic_number": 3, "symbol": "Li",
-           "atomic_mass": 6.94*u.u, "name": "lithium"},
+           "atomic_mass": 6.94*u.u, "name": "lithium", "period": 2,
+           "group": 1, "block": "s", "category": "Alkali metals"},
     "Be": {"atomic_number": 4, "symbol": "Be",
-           "atomic_mass": 9.0121831*u.u, "name": "beryllium"},
+           "atomic_mass": 9.0121831*u.u, "name": "beryllium", "period": 2,
+           "group": 2, "block": "s", "category": "Alkaline earth metals"},
     "B": {"atomic_number": 5, "symbol": "B",
-          "atomic_mass": 10.806*u.u, "name": "boron"},
+          "atomic_mass": 10.806*u.u, "name": "boron", "period": 2,
+          "group": 13, "block": "p", "category": "Metalloid"},
     "C": {"atomic_number": 6, "symbol": "C",
-          "atomic_mass": 12.011*u.u, "name": "carbon"},
+          "atomic_mass": 12.011*u.u, "name": "carbon", "period": 2,
+          "group": 14, "block": "p", "category": "Nonmetals"},
     "N": {"atomic_number": 7, "symbol": "N",
-          "atomic_mass": 14.007*u.u, "name": "nitrogen"},
+          "atomic_mass": 14.007*u.u, "name": "nitrogen", "period": 2,
+          "group": 15, "block": "p", "category": "Nonmetals"},
     "O": {"atomic_number": 8, "symbol": "O",
-          "atomic_mass": 15.999*u.u, "name": "oxygen"},
+          "atomic_mass": 15.999*u.u, "name": "oxygen", "period": 2,
+          "group": 16, "block": "p", "category": "Nonmetals"},
     "F": {"atomic_number": 9, "symbol": "F",
-          "atomic_mass": 18.998403163*u.u, "name": "fluorine"},
+          "atomic_mass": 18.998403163*u.u, "name": "fluorine", "period": 2,
+          "group": 17, "block": "p", "category": "Halogens"},
     "Ne": {"atomic_number": 10, "symbol": "Ne",
-           "atomic_mass": 20.1797*u.u, "name": "neon"},
+           "atomic_mass": 20.1797*u.u, "name": "neon", "period": 2,
+           "group": 18, "block": "p", "category": "Noble gases"},
     "Na": {"atomic_number": 11, "symbol": "Na",
-           "atomic_mass": 22.98976928*u.u, "name": "sodium"},
+           "atomic_mass": 22.98976928*u.u, "name": "sodium", "period": 3,
+           "group": 1, "block": "s", "category": "Alkali metals"},
     "Mg": {"atomic_number": 12, "symbol": "Mg",
-           "atomic_mass": 24.305*u.u, "name": "magnesium"},
+           "atomic_mass": 24.305*u.u, "name": "magnesium", "period": 3,
+           "group": 2, "block": "s", "category": "Alkaline earth metals"},
     "Al": {"atomic_number": 13, "symbol": "Al",
-           "atomic_mass": 26.9815385*u.u, "name": "aluminium"},
+           "atomic_mass": 26.9815385*u.u, "name": "aluminium", "period": 3,
+           "group": 13, "block": "p", "category": "Post-transition metals"},
     "Si": {"atomic_number": 14, "symbol": "Si",
-           "atomic_mass": 28.085*u.u, "name": "silicon"},
+           "atomic_mass": 28.085*u.u, "name": "silicon", "period": 3,
+           "group": 14, "block": "p", "category": "Metalloid"},
     "P": {"atomic_number": 15, "symbol": "P",
-          "atomic_mass": 30.973761998*u.u, "name": "phosphorus"},
+          "atomic_mass": 30.973761998*u.u, "name": "phosphorus", "period": 3,
+          "group": 15, "block": "p", "category": "Nonmetals"},
     "S": {"atomic_number": 16, "symbol": "S",
-          "atomic_mass": 32.06*u.u, "name": "sulfur"},
+          "atomic_mass": 32.06*u.u, "name": "sulfur", "period": 3,
+          "group": 16, "block": "p", "category": "Nonmetals"},
     "Cl": {"atomic_number": 17, "symbol": "Cl",
-           "atomic_mass": 35.45*u.u, "name": "chlorine"},
+           "atomic_mass": 35.45*u.u, "name": "chlorine", "period": 3,
+           "group": 17, "block": "p", "category": "Halogens"},
     "Ar": {"atomic_number": 18, "symbol": "Ar",
-           "atomic_mass": 39.948*u.u, "name": "argon"},
+           "atomic_mass": 39.948*u.u, "name": "argon", "period": 3,
+           "group": 18, "block": "p", "category": "Noble gases"},
     "K": {"atomic_number": 19, "symbol": "K",
-          "atomic_mass": 39.0983*u.u, "name": "potassium"},
+          "atomic_mass": 39.0983*u.u, "name": "potassium", "period": 4,
+          "group": 1, "block": "s", "category": "Alkali metals"},
     "Ca": {"atomic_number": 20, "symbol": "Ca",
-           "atomic_mass": 40.078*u.u, "name": "calcium"},
+           "atomic_mass": 40.078*u.u, "name": "calcium", "period": 4,
+           "group": 2, "block": "s", "category": "Alkaline earth metals"},
     "Sc": {"atomic_number": 21, "symbol": "Sc",
-           "atomic_mass": 44.955908*u.u, "name": "scandium"},
+           "atomic_mass": 44.955908*u.u, "name": "scandium", "period": 4,
+           "group": 3, "block": "d", "category": "Transition metals"},
     "Ti": {"atomic_number": 22, "symbol": "Ti",
-           "atomic_mass": 47.867*u.u, "name": "titanium"},
+           "atomic_mass": 47.867*u.u, "name": "titanium", "period": 4,
+           "group": 4, "block": "d", "category": "Transition metals"},
     "V": {"atomic_number": 23, "symbol": "V",
-          "atomic_mass": 50.9415*u.u, "name": "vanadium"},
+          "atomic_mass": 50.9415*u.u, "name": "vanadium", "period": 4,
+          "group": 5, "block": "d", "category": "Transition metals"},
     "Cr": {"atomic_number": 24, "symbol": "Cr",
-           "atomic_mass": 51.9961*u.u, "name": "chromium"},
+           "atomic_mass": 51.9961*u.u, "name": "chromium", "period": 4,
+           "group": 6, "block": "d", "category": "Transition metals"},
     "Mn": {"atomic_number": 25, "symbol": "Mn",
-           "atomic_mass": 54.938044*u.u, "name": "manganese"},
+           "atomic_mass": 54.938044*u.u, "name": "manganese", "period": 4,
+           "group": 7, "block": "d", "category": "Transition metals"},
     "Fe": {"atomic_number": 26, "symbol": "Fe",
-           "atomic_mass": 55.845*u.u, "name": "iron"},
+           "atomic_mass": 55.845*u.u, "name": "iron", "period": 4,
+           "group": 8, "block": "d", "category": "Transition metals"},
     "Co": {"atomic_number": 27, "symbol": "Co",
-           "atomic_mass": 58.933*u.u, "name": "cobalt"},
+           "atomic_mass": 58.933*u.u, "name": "cobalt", "period": 4,
+           "group": 9, "block": "d", "category": "Transition metals"},
     "Ni": {"atomic_number": 28, "symbol": "Ni",
-           "atomic_mass": 58.6934*u.u, "name": "nickel"},
+           "atomic_mass": 58.6934*u.u, "name": "nickel", "period": 4,
+           "group": 10, "block": "d", "category": "Transition metals"},
     "Cu": {"atomic_number": 29, "symbol": "Cu",
-           "atomic_mass": 63.546*u.u, "name": "copper"},
+           "atomic_mass": 63.546*u.u, "name": "copper", "period": 4,
+           "group": 11, "block": "d", "category": "Transition metals"},
     "Zn": {"atomic_number": 30, "symbol": "Zn",
-           "atomic_mass": 65.38*u.u, "name": "zinc"},
+           "atomic_mass": 65.38*u.u, "name": "zinc", "period": 4,
+           "group": 12, "block": "d", "category": "Transition metals"},
     "Ga": {"atomic_number": 31, "symbol": "Ga",
-           "atomic_mass": 69.723*u.u, "name": "gallium"},
+           "atomic_mass": 69.723*u.u, "name": "gallium", "period": 4,
+           "group": 13, "block": "p", "category": "Post-transition metals"},
     "Ge": {"atomic_number": 32, "symbol": "Ge",
-           "atomic_mass": 72.630*u.u, "name": "germanium"},
+           "atomic_mass": 72.630*u.u, "name": "germanium", "period": 4,
+           "group": 14, "block": "p", "category": "Metalloid"},
     "As": {"atomic_number": 33, "symbol": "As",
-           "atomic_mass": 74.921595*u.u, "name": "arsenic"},
+           "atomic_mass": 74.921595*u.u, "name": "arsenic", "period": 4,
+           "group": 15, "block": "p", "category": "Metalloid"},
     "Se": {"atomic_number": 34, "symbol": "Se",
-           "atomic_mass": 78.971*u.u, "name": "selenium"},
+           "atomic_mass": 78.971*u.u, "name": "selenium", "period": 4,
+           "group": 16, "block": "p", "category": "Nonmetals"},
     "Br": {"atomic_number": 35, "symbol": "Br",
-           "atomic_mass": 79.904*u.u, "name": "bromine"},
+           "atomic_mass": 79.904*u.u, "name": "bromine", "period": 4,
+           "group": 17, "block": "p", "category": "Halogens"},
     "Kr": {"atomic_number": 36, "symbol": "Kr",
-           "atomic_mass": 83.798*u.u, "name": "krypton"},
+           "atomic_mass": 83.798*u.u, "name": "krypton", "period": 4,
+           "group": 18, "block": "p", "category": "Noble gases"},
     "Rb": {"atomic_number": 37, "symbol": "Rb",
-           "atomic_mass": 85.4678*u.u, "name": "rubidium"},
+           "atomic_mass": 85.4678*u.u, "name": "rubidium", "period": 5,
+           "group": 1, "block": "s", "category": "Alkali metals"},
     "Sr": {"atomic_number": 38, "symbol": "Sr",
-           "atomic_mass": 87.62*u.u, "name": "strontium"},
+           "atomic_mass": 87.62*u.u, "name": "strontium", "period": 5,
+           "group": 2, "block": "s", "category": "Alkaline earth metals"},
     "Y": {"atomic_number": 39, "symbol": "Y",
-          "atomic_mass": 88.90584*u.u, "name": "yttrium"},
+          "atomic_mass": 88.90584*u.u, "name": "yttrium", "period": 5,
+          "group": 3, "block": "d", "category": "Transition metals"},
     "Zr": {"atomic_number": 40, "symbol": "Zr",
-           "atomic_mass": 91.224*u.u, "name": "zirconium"},
+           "atomic_mass": 91.224*u.u, "name": "zirconium", "period": 5,
+           "group": 4, "block": "d", "category": "Transition metals"},
     "Nb": {"atomic_number": 41, "symbol": "Nb",
-           "atomic_mass": 92.90637*u.u, "name": "niobium"},
+           "atomic_mass": 92.90637*u.u, "name": "niobium", "period": 5,
+           "group": 5, "block": "d", "category": "Transition metals"},
     "Mo": {"atomic_number": 42, "symbol": "Mo",
-           "atomic_mass": 95.95*u.u, "name": "molybdenum"},
+           "atomic_mass": 95.95*u.u, "name": "molybdenum", "period": 5,
+           "group": 6, "block": "d", "category": "Transition metals"},
     "Tc": {"atomic_number": 43, "symbol": "Tc",
-           "name": "technetium"},
+           "name": "technetium", "period": 5,
+           "group": 7, "block": "d", "category": "Transition metals"},
     "Ru": {"atomic_number": 44, "symbol": "Ru",
-           "atomic_mass": 101.07*u.u, "name": "ruthenium"},
+           "atomic_mass": 101.07*u.u, "name": "ruthenium", "period": 5,
+           "group": 8, "block": "d", "category": "Transition metals"},
     "Rh": {"atomic_number": 45, "symbol": "Rh",
-           "atomic_mass": 102.90550*u.u, "name": "rhodium"},
+           "atomic_mass": 102.90550*u.u, "name": "rhodium", "period": 5,
+           "group": 9, "block": "d", "category": "Transition metals"},
     "Pd": {"atomic_number": 46, "symbol": "Pd",
-           "atomic_mass": 106.42*u.u, "name": "palladium"},
+           "atomic_mass": 106.42*u.u, "name": "palladium", "period": 5,
+           "group": 10, "block": "d", "category": "Transition metals"},
     "Ag": {"atomic_number": 47, "symbol": "Ag",
-           "atomic_mass": 107.8682*u.u, "name": "silver"},
+           "atomic_mass": 107.8682*u.u, "name": "silver", "period": 5,
+           "group": 11, "block": "d", "category": "Transition metals"},
     "Cd": {"atomic_number": 48, "symbol": "Cd",
-           "atomic_mass": 112.414*u.u, "name": "cadmium"},
+           "atomic_mass": 112.414*u.u, "name": "cadmium", "period": 5,
+           "group": 12, "block": "d", "category": "Transition metals"},
     "In": {"atomic_number": 49, "symbol": "In",
-           "atomic_mass": 114.818*u.u, "name": "indium"},
+           "atomic_mass": 114.818*u.u, "name": "indium", "period": 5,
+           "group": 13, "block": "p", "category": "Post-transition metals"},
     "Sn": {"atomic_number": 50, "symbol": "Sn",
-           "atomic_mass": 118.710*u.u, "name": "tin"},
+           "atomic_mass": 118.710*u.u, "name": "tin", "period": 5,
+           "group": 14, "block": "p", "category": "Post-transition metals"},
     "Sb": {"atomic_number": 51, "symbol": "Sb",
-           "atomic_mass": 121.760*u.u, "name": "antimony"},
+           "atomic_mass": 121.760*u.u, "name": "antimony", "period": 5,
+           "group": 15, "block": "p", "category": "Metalloid"},
     "Te": {"atomic_number": 52, "symbol": "Te",
-           "atomic_mass": 127.60*u.u, "name": "tellurium"},
+           "atomic_mass": 127.60*u.u, "name": "tellurium", "period": 5,
+           "group": 16, "block": "p", "category": "Metalloid"},
     "I": {"atomic_number": 53, "symbol": "I",
-          "atomic_mass": 126.90447*u.u, "name": "iodine"},
+          "atomic_mass": 126.90447*u.u, "name": "iodine", "period": 5,
+          "group": 17, "block": "p", "category": "Halogens"},
     "Xe": {"atomic_number": 54, "symbol": "Xe",
-           "atomic_mass": 131.293*u.u, "name": "xenon"},
+           "atomic_mass": 131.293*u.u, "name": "xenon", "period": 5,
+           "group": 18, "block": "p", "category": "Noble gases"},
     "Cs": {"atomic_number": 55, "symbol": "Cs",
-           "atomic_mass": 132.90545196*u.u, "name": "caesium"},
+           "atomic_mass": 132.90545196*u.u, "name": "caesium", "period": 6,
+           "group": 1, "block": "s", "category": "Alkali metals"},
     "Ba": {"atomic_number": 56, "symbol": "Ba",
-           "atomic_mass": 137.327*u.u, "name": "barium"},
+           "atomic_mass": 137.327*u.u, "name": "barium", "period": 6,
+           "group": 2, "block": "s", "category": "Alkaline earth metals"},
     "La": {"atomic_number": 57, "symbol": "La",
-           "atomic_mass": 138.90547*u.u, "name": "lanthanum"},
+           "atomic_mass": 138.90547*u.u, "name": "lanthanum", "period": 6,
+           "group": 3, "block": "d", "category": "Lanthanides"},
     "Ce": {"atomic_number": 58, "symbol": "Ce",
-           "atomic_mass": 140.116*u.u, "name": "cerium"},
+           "atomic_mass": 140.116*u.u, "name": "cerium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Pr": {"atomic_number": 59, "symbol": "Pr",
-           "atomic_mass": 140.90766*u.u, "name": "praseodymium"},
+           "atomic_mass": 140.90766*u.u, "name": "praseodymium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Nd": {"atomic_number": 60, "symbol": "Nd",
-           "atomic_mass": 144.242*u.u, "name": "neodymium"},
+           "atomic_mass": 144.242*u.u, "name": "neodymium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Pm": {"atomic_number": 61, "symbol": "Pm",
-           "name": "promethium"},
+           "name": "promethium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Sm": {"atomic_number": 62, "symbol": "Sm",
-           "atomic_mass": 150.36*u.u, "name": "samarium"},
+           "atomic_mass": 150.36*u.u, "name": "samarium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Eu": {"atomic_number": 63, "symbol": "Eu",
-           "atomic_mass": 151.964*u.u, "name": "europium"},
+           "atomic_mass": 151.964*u.u, "name": "europium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Gd": {"atomic_number": 64, "symbol": "Gd",
-           "atomic_mass": 157.25*u.u, "name": "gadolinium"},
+           "atomic_mass": 157.25*u.u, "name": "gadolinium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Tb": {"atomic_number": 65, "symbol": "Tb",
-           "atomic_mass": 158.92535*u.u, "name": "terbium"},
+           "atomic_mass": 158.92535*u.u, "name": "terbium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Dy": {"atomic_number": 66, "symbol": "Dy",
-           "atomic_mass": 162.500*u.u, "name": "dysprosium"},
+           "atomic_mass": 162.500*u.u, "name": "dysprosium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Ho": {"atomic_number": 67, "symbol": "Ho",
-           "atomic_mass": 164.93033*u.u, "name": "holmium"},
+           "atomic_mass": 164.93033*u.u, "name": "holmium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Er": {"atomic_number": 68, "symbol": "Er",
-           "atomic_mass": 167.259*u.u, "name": "erbium"},
+           "atomic_mass": 167.259*u.u, "name": "erbium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Tm": {"atomic_number": 69, "symbol": "Tm",
-           "atomic_mass": 168.93422*u.u, "name": "thulium"},
+           "atomic_mass": 168.93422*u.u, "name": "thulium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Yb": {"atomic_number": 70, "symbol": "Yb",
-           "atomic_mass": 173.045*u.u, "name": "ytterbium"},
+           "atomic_mass": 173.045*u.u, "name": "ytterbium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Lu": {"atomic_number": 71, "symbol": "Lu",
-           "atomic_mass": 174.9668*u.u, "name": "lutetium"},
+           "atomic_mass": 174.9668*u.u, "name": "lutetium", "period": 6,
+           "group": 3, "block": "f", "category": "Lanthanides"},
     "Hf": {"atomic_number": 72, "symbol": "Hf",
-           "atomic_mass": 178.49*u.u, "name": "hafnium"},
+           "atomic_mass": 178.49*u.u, "name": "hafnium", "period": 6,
+           "group": 4, "block": "d", "category": "Transition metals"},
     "Ta": {"atomic_number": 73, "symbol": "Ta",
-           "atomic_mass": 180.94788*u.u, "name": "tantalum"},
+           "atomic_mass": 180.94788*u.u, "name": "tantalum", "period": 6,
+           "group": 5, "block": "d", "category": "Transition metals"},
     "W": {"atomic_number": 74, "symbol": "W",
-          "atomic_mass": 183.84*u.u, "name": "tungsten"},
+          "atomic_mass": 183.84*u.u, "name": "tungsten", "period": 6,
+           "group": 6, "block": "d", "category": "Transition metals"},
     "Re": {"atomic_number": 75, "symbol": "Re",
-           "atomic_mass": 186.207*u.u, "name": "rhenium"},
+           "atomic_mass": 186.207*u.u, "name": "rhenium", "period": 6,
+           "group": 7, "block": "d", "category": "Transition metals"},
     "Os": {"atomic_number": 76, "symbol": "Os",
-           "atomic_mass": 190.23*u.u, "name": "osmium"},
+           "atomic_mass": 190.23*u.u, "name": "osmium", "period": 6,
+           "group": 8, "block": "d", "category": "Transition metals"},
     "Ir": {"atomic_number": 77, "symbol": "Ir",
-           "atomic_mass": 192.217*u.u, "name": "iridium"},
+           "atomic_mass": 192.217*u.u, "name": "iridium", "period": 6,
+           "group": 9, "block": "d", "category": "Transition metals"},
     "Pt": {"atomic_number": 78, "symbol": "Pt",
-           "atomic_mass": 195.084*u.u, "name": "platinum"},
+           "atomic_mass": 195.084*u.u, "name": "platinum", "period": 6,
+           "group": 10, "block": "d", "category": "Transition metals"},
     "Au": {"atomic_number": 79, "symbol": "Au",
-           "atomic_mass": 196.966569*u.u, "name": "gold"},
+           "atomic_mass": 196.966569*u.u, "name": "gold", "period": 6,
+           "group": 11, "block": "d", "category": "Transition metals"},
     "Hg": {"atomic_number": 80, "symbol": "Hg",
-           "atomic_mass": 200.592*u.u, "name": "mercury"},
+           "atomic_mass": 200.592*u.u, "name": "mercury", "period": 6,
+           "group": 12, "block": "d", "category": "Transition metals"},
     "Tl": {"atomic_number": 81, "symbol": "Tl",
-           "atomic_mass": 204.38*u.u, "name": "thallium"},
+           "atomic_mass": 204.38*u.u, "name": "thallium", "period": 6,
+           "group": 13, "block": "p", "category": "Post-transition metals"},
     "Pb": {"atomic_number": 82, "symbol": "Pb",
-           "atomic_mass": 207.2*u.u, "name": "lead"},
+           "atomic_mass": 207.2*u.u, "name": "lead", "period": 6,
+           "group": 14, "block": "p", "category": "Post-transition metals"},
     "Bi": {"atomic_number": 83, "symbol": "Bi",
-           "atomic_mass": 208.98040*u.u, "name": "bismuth"},
+           "atomic_mass": 208.98040*u.u, "name": "bismuth", "period": 6,
+           "group": 15, "block": "p", "category": "Post-transition metals"},
     "Po": {"atomic_number": 84, "symbol": "Po",
-           "name": "polonium"},
+           "name": "polonium", "period": 6,
+           "group": 16, "block": "p", "category": "Metalloid"},
     "At": {"atomic_number": 85, "symbol": "At",
-           "name": "astatine"},
+           "name": "astatine", "period": 6,
+           "group": 17, "block": "p", "category": "Halogens"},
     "Rn": {"atomic_number": 86, "symbol": "Rn",
-           "name": "radon"},
+           "name": "radon", "period": 6,
+           "group": 18, "block": "p", "category": "Noble gases"},
     "Fr": {"atomic_number": 87, "symbol": "Fr",
-           "name": "francium"},
+           "name": "francium", "period": 7,
+           "group": 1, "block": "s", "category": "Alkali metals"},
     "Ra": {"atomic_number": 88, "symbol": "Ra",
-           "name": "radium"},
+           "name": "radium", "period": 7,
+           "group": 2, "block": "s", "category": "Alkaline earth metals"},
     "Ac": {"atomic_number": 89, "symbol": "Ac",
-           "name": "actinium"},
+           "name": "actinium", "period": 7,
+           "group": 3, "block": "d", "category": "Actinides"},
     "Th": {"atomic_number": 90, "symbol": "Th",
-           "atomic_mass": 232.0377*u.u, "name": "thorium"},
+           "atomic_mass": 232.0377*u.u, "name": "thorium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Pa": {"atomic_number": 91, "symbol": "Pa",
-           "atomic_mass": 231.03588*u.u, "name": "protactinium"},
+           "atomic_mass": 231.03588*u.u, "name": "protactinium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "U": {"atomic_number": 92, "symbol": "U",
-          "atomic_mass": 238.02891*u.u, "name": "uranium"},
+          "atomic_mass": 238.02891*u.u, "name": "uranium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Np": {"atomic_number": 93, "symbol": "Np",
-           "name": "neptunium"},
+           "name": "neptunium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Pu": {"atomic_number": 94, "symbol": "Pu",
-           "name": "plutonium"},
+           "name": "plutonium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Am": {"atomic_number": 95, "symbol": "Am",
-           "name": "americium"},
+           "name": "americium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Cm": {"atomic_number": 96, "symbol": "Cm",
-           "name": "curium"},
+           "name": "curium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Bk": {"atomic_number": 97, "symbol": "Bk",
-           "name": "berkelium"},
+           "name": "berkelium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Cf": {"atomic_number": 98, "symbol": "Cf",
-           "name": "californium"},
+           "name": "californium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Es": {"atomic_number": 99, "symbol": "Es",
-           "name": "einsteinium"},
+           "name": "einsteinium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Fm": {"atomic_number": 100, "symbol": "Fm",
-           "name": "fermium"},
+           "name": "fermium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Md": {"atomic_number": 101, "symbol": "Md",
-           "name": "mendelevium"},
+           "name": "mendelevium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "No": {"atomic_number": 102, "symbol": "No",
-           "name": "nobelium"},
+           "name": "nobelium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Lr": {"atomic_number": 103, "symbol": "Lr",
-           "name": "lawrencium"},
+           "name": "lawrencium", "period": 7,
+           "group": 3, "block": "f", "category": "Actinides"},
     "Rf": {"atomic_number": 104, "symbol": "Rf",
-           "name": "rutherfordium"},
+           "name": "rutherfordium", "period": 7,
+           "group": 4, "block": "d", "category": "Transition metals"},
     "Db": {"atomic_number": 105, "symbol": "Db",
-           "name": "dubnium"},
+           "name": "dubnium", "period": 7,
+           "group": 5, "block": "d", "category": "Transition metals"},
     "Sg": {"atomic_number": 106, "symbol": "Sg",
-           "name": "seaborgium"},
+           "name": "seaborgium", "period": 7,
+           "group": 6, "block": "d", "category": "Transition metals"},
     "Bh": {"atomic_number": 107, "symbol": "Bh",
-           "name": "bohrium"},
+           "name": "bohrium", "period": 7,
+           "group": 7, "block": "d", "category": "Transition metals"},
     "Hs": {"atomic_number": 108, "symbol": "Hs",
-           "name": "hassium"},
+           "name": "hassium", "period": 7,
+           "group": 8, "block": "d", "category": "Transition metals"},
     "Mt": {"atomic_number": 109, "symbol": "Mt",
-           "name": "meitnerium"},
+           "name": "meitnerium", "period": 7,
+           "group": 9, "block": "d", "category": "Transition metals"},
     "Ds": {"atomic_number": 110, "symbol": "Ds",
-           "name": "darmstadtium"},
+           "name": "darmstadtium", "period": 7,
+           "group": 10, "block": "d", "category": "Transition metals"},
     "Rg": {"atomic_number": 111, "symbol": "Rg",
-           "name": "roentgenium"},
+           "name": "roentgenium", "period": 7,
+           "group": 11, "block": "d", "category": "Transition metals"},
     "Cn": {"atomic_number": 112, "symbol": "Cn",
-           "name": "copernicium"},
+           "name": "copernicium", "period": 7,
+           "group": 12, "block": "d", "category": "Transition metals"},
     "Nh": {"atomic_number": 113, "symbol": "Nh",
-           "name": "nihonium"},
+           "name": "nihonium", "period": 7,
+           "group": 13, "block": "p", "category": "Post-transition metals"},
     "Fl": {"atomic_number": 114, "symbol": "Fl",
-           "name": "flerovium"},
+           "name": "flerovium", "period": 7,
+           "group": 14, "block": "p", "category": "Post-transition metals"},
     "Mc": {"atomic_number": 115, "symbol": "Mc",
-           "name": "moscovium"},
+           "name": "moscovium", "period": 7,
+           "group": 15, "block": "p", "category": "Post-transition metals"},
     "Lv": {"atomic_number": 116, "symbol": "Lv",
-           "name": "livermorium"},
+           "name": "livermorium", "period": 7,
+           "group": 16, "block": "p", "category": "Post-transition metals"},
     "Ts": {"atomic_number": 117, "symbol": "Ts",
-           "name": "tennessine"},
+           "name": "tennessine", "period": 7,
+           "group": 17, "block": "p", "category": "Halogens"},
     "Og": {"atomic_number": 118, "symbol": "Og",
-           "name": "oganesson"},
+           "name": "oganesson", "period": 7,
+           "group": 18, "block": "p", "category": "Noble gases"},
     }


Test patch:
diff --git a/plasmapy/atomic/tests/test_atomic.py b/plasmapy/atomic/tests/test_atomic.py
--- a/plasmapy/atomic/tests/test_atomic.py
+++ b/plasmapy/atomic/tests/test_atomic.py
@@ -31,7 +31,11 @@
                       stable_isotopes,
                       isotopic_abundance,
                       integer_charge,
-                      electric_charge)
+                      electric_charge,
+                      periodic_table_period,
+                      periodic_table_block,
+                      periodic_table_category,
+                      periodic_table_group)
 
 from ..nuclear import (nuclear_binding_energy, nuclear_reaction_energy)
 
@@ -759,7 +763,6 @@ def test_half_life_unstable_isotopes():
 def test_half_life_u_220():
     """Test that half_life returns None and issues a warning for an isotope
     without half-life data.
-
     If half-life data is added for this isotope, then this test should fail
     and a different isotope without half-life data should be chosen instead
     until all isotopes have half-life data."""
@@ -879,13 +882,10 @@ def test_known_common_stable_isotopes_cases():
 def test_known_common_stable_isotopes_len():
     """Test that known_isotopes, common_isotopes, and stable_isotopes return
     lists of the expected lengths.
-
     The number of common isotopes may change if isotopic composition data
     has any significant changes.
-
     The number of stable isotopes may decrease slightly if some isotopes are
     discovered to be unstable but with extremely long half-lives.
-
     The number of known isotopes will increase as new isotopes are discovered,
     so a buffer is included in the test."""
 
@@ -1286,3 +1286,173 @@ def test_extract_integer_charge_warnings(test_input, expected_warning):
     """Test that _extract_integer_charge issues the expected warnings."""
     with pytest.warns(expected_warning):
         _extract_integer_charge(test_input)
+
+
+# argument, expected
+period_table = [
+    ("Ca", 4),
+    ("Na", 3),
+    ("Rf", 7),
+    ("Be", 2),
+    ("calcium", 4),
+    ("CALCIUM", 4),
+    ("Hydrogen", 1),
+    ("hYDROGEN", 1),
+    ("potassium", 4),
+    ("Cadmium", 5),
+    (2, 1),
+    (11, 3),
+    (39, 5),
+    (110, 7),
+    ("43", 5),
+    ("81", 6),
+    ("2", 1),
+    ("88", 7),
+]
+
+
+@pytest.mark.parametrize(
+    'argument, expected', period_table)
+def test_periodic_table_period(argument, expected):
+    """Test that periodic_table_period returns the expected result."""
+    assert periodic_table_period(argument) == expected, \
+        (f"periodic_table_period({argument}) is returning "
+         f"{periodic_table_period(argument)}, which differs from the expected "
+         f"value of {expected}.")
+
+
+# argument, expected
+block_table = [
+    ("Ca", "s"),
+    ("Na", "s"),
+    ("Rf", "d"),
+    ("Be", "s"),
+    ("calcium", "s"),
+    ("CALCIUM", "s"),
+    ("Hydrogen", "s"),
+    ("hYDROGEN", "s"),
+    ("potassium", "s"),
+    ("Cadmium", "d"),
+    (2, "s"),
+    (13, "p"),
+    (47, "d"),
+    (66, "f"),
+    ("2", "s"),
+    ("13", "p"),
+    ("47", "d"),
+    ("66", "f"),
+]
+
+
+@pytest.mark.parametrize(
+    'argument, expected', block_table)
+def test_periodic_table_block(argument, expected):
+    """Test that periodic_table_block returns the expected result."""
+    assert periodic_table_block(argument) == expected, \
+        (f"periodic_table_block({argument}) is returning "
+         f"{periodic_table_block(argument)}, which differs from the expected "
+         f"value of {expected}.")
+
+
+# argument, expected
+group_table = [
+    ("Ca", 2),
+    ("Na", 1),
+    ("Rf", 4),
+    ("Be", 2),
+    ("calcium", 2),
+    ("CALCIUM", 2),
+    ("Hydrogen", 1),
+    ("hYDROGEN", 1),
+    ("argon", 18),
+    ("Iron", 8),
+    (2, 18),
+    (13, 13),
+    (47, 11),
+    (66, 3),
+    ("2", 18),
+    ("13", 13),
+    ("47", 11),
+    ("66", 3),
+]
+
+
+@pytest.mark.parametrize(
+    'argument, expected', group_table)
+def test_periodic_table_group(argument, expected):
+    """Test that periodic_table_group returns the expected result."""
+    assert periodic_table_group(argument) == expected, \
+        (f"periodic_table_group({argument}) is returning "
+         f"{periodic_table_group(argument)}, which differs from the expected "
+         f"value of {expected}.")
+
+
+# argument, expected
+category_table = [
+    ("Ca", "Alkaline earth metals"),
+    ("Na", "Alkali metals"),
+    ("Rf", "Transition metals"),
+    ("Be", "Alkaline earth metals"),
+    ("calcium", "Alkaline earth metals"),
+    ("CALCIUM", "Alkaline earth metals"),
+    ("Hydrogen", "Nonmetals"),
+    ("hYDROGEN", "Nonmetals"),
+    ("argon", "Noble gases"),
+    ("Iron", "Transition metals"),
+    (2, "Noble gases"),
+    (13, "Post-transition metals"),
+    (47, "Transition metals"),
+    (66, "Lanthanides"),
+    ("2", "Noble gases"),
+    ("13", "Post-transition metals"),
+    ("47", "Transition metals"),
+    ("66", "Lanthanides"),
+]
+
+
+@pytest.mark.parametrize(
+    'argument, expected', category_table)
+def test_periodic_table_category(argument, expected):
+    """Test that periodic_table_category returns the expected result."""
+    assert periodic_table_category(argument) == expected, \
+        (f"periodic_table_category({argument}) is returning "
+         f"{periodic_table_category(argument)}, which differs from the "
+         f"expected value of {expected}.")
+
+
+# (argument, expected_error)
+periodic_data_error_table = [
+    (3.14159, TypeError),
+    (None, TypeError),
+    (['cat', 'dog'], TypeError),
+    (("foo", "bar"), TypeError),
+    ({"bob": "alice"}, TypeError),
+]
+
+
+@pytest.mark.parametrize(
+    'argument, expected_error', periodic_data_error_table)
+def test_periodic_table_data_error(argument, expected_error):
+    """
+    Test that periodic_table_[period/group/block/category] raises the expected
+    exceptions.
+    """
+    with pytest.raises(expected_error, message=(
+            f"periodic_table_period({argument}) is not raising "
+            f"{expected_error}.")):
+        periodic_table_period(argument)
+
+    with pytest.raises(expected_error, message=(
+            f"periodic_table_group({argument}) is not raising "
+            f"{expected_error}.")):
+        periodic_table_group(argument)
+
+    with pytest.raises(expected_error, message=(
+            f"periodic_table_block({argument}) is not raising "
+            f"{expected_error}.")):
+        periodic_table_block(argument)
+
+    with pytest.raises(expected_error, message=(
+            f"periodic_table_category({argument}) is not raising "
+            f"{expected_error}.")):
+        periodic_table_category(argument)