Working with Units

The mendeleev package provides built-in support for accessing physical properties with their proper units using the Pint library.

Simply append _u to any property name to get a pint.Quantity object with units attached.

Basic Usage

[1]:
from mendeleev import H, C, Al, Fe

# Without units (raw numbers, same as always)
print(f"H atomic weight: {H.atomic_weight}")
print(f"C density: {C.density}")

# With units (pint Quantity objects)
print(f"H atomic weight: {H.atomic_weight_u}")
print(f"C density: {C.density_u}")
H atomic weight: 1.008
C density: 2.2
H atomic weight: 1.008 dalton
C density: 2.2 gram / centimeter ** 3

Unit Conversions

The returned objects are Pint Quantity instances that support unit conversions:

[2]:
# Temperature conversions
al_melting = Al.melting_point_u
print(f"Kelvin: {al_melting}")
print(f"Celsius: {al_melting.to('celsius')}")
print(f"Fahrenheit: {al_melting.to('fahrenheit')}")
Kelvin: 933.473 kelvin
Celsius: 660.323 degree_Celsius
Fahrenheit: 1220.5813999999998 degree_Fahrenheit
[3]:
# Length conversions
fe_radius = Fe.atomic_radius_u
print(f"Picometers: {fe_radius}")
print(f"Angstroms: {fe_radius.to('angstrom')}")
print(f"Nanometers: {fe_radius.to('nanometer')}")
Picometers: 140.0 picometer
Angstroms: 1.4000000000000001 angstrom
Nanometers: 0.13999999999999999 nanometer

Calculations with Units

pint Quantities support arithmetic while preserving dimensional correctness:

[4]:
from mendeleev.models import ureg

# Calculate mass of a volume of aluminum
density = Al.density_u
volume = 100 * ureg.milliliter
mass = density * volume

print(f"Density: {density}")
print(f"Volume: {volume}")
print(f"Mass: {mass.to('gram')}")
Density: 2.7 gram / centimeter ** 3
Volume: 100 milliliter
Mass: 270.00000000000006 gram
[5]:
# Convert electron affinity to different energy units
fe_ea = Fe.electron_affinity_u
print(f"Electron affinity: {fe_ea}")
print(f"In joules: {fe_ea.to('joule')}")
Electron affinity: 0.151 electron_volt
In joules: 2.4192867173399996e-20 joule

Working with Multiple Elements

Units make it easy to compare properties across elements:

[6]:
elements = [Al, Fe, H, C]

print("Element densities:")
for el in elements:
    d = el.density_u
    if d is not None:
        print(f"  {el.name}: {d}")
    else:
        print(f"  {el.name}: no data")
Element densities:
  Aluminum: 2.7 gram / centimeter ** 3
  Iron: 7.87 gram / centimeter ** 3
  Hydrogen: 8.2e-05 gram / centimeter ** 3
  Carbon: 2.2 gram / centimeter ** 3

Handling Missing Data

Properties with None values return None when accessed with _u. Properties without units defined raise AttributeError.

[7]:
# None values stay None
print(f"H gas_basicity: {H.gas_basicity}")
print(f"H gas_basicity with units: {H.gas_basicity_u}")

# Properties without units raise AttributeError
try:
    print(H.symbol_u)
except AttributeError as e:
    print(f"Error: {e}")
H gas_basicity: None
H gas_basicity with units: None
Error: 'Element' has no unit defined for 'symbol'

Ionic Radii with Units

Other model classes like IonicRadius also support the _u suffix:

[8]:
from mendeleev.db import get_session
from mendeleev.models import IonicRadius

session = get_session()
ionic = session.query(IonicRadius).first()

print(f"Charge: {ionic.charge_u}")
print(f"Ionic radius: {ionic.ionic_radius_u}")
print(f"Crystal radius: {ionic.crystal_radius_u}")

session.close()
Charge: 3 elementary_charge
Ionic radius: 112.00000000000001 picometer
Crystal radius: 126.0 picometer

Summary

The _u suffix provides:

  • Convenience — append _u to any property for units

  • Conversions — use .to() to convert between unit systems

  • Safety — pint catches dimension mismatches in calculations

  • Transparency — no guessing what units a number is in

See the units reference for the complete list of properties with units.