juliensimon/solar-system-moons
Solar System Moons Credit: NASA/JPL-Caltech Part of a dataset collection on Hugging Face. Dataset description Every known natural satellite of planets and dwarf planets in the Solar System with orbital elements, physical parameters, and discovery data. Sourced from NASA JPL Solar System Dynamics. This dataset catalogs all recognized natural satellites orbiting the major planets (Earth through Neptune) and the dwarf planet Pluto, as maintained by NASA's… See the full description on the dataset page: https://huggingface.co/datasets/juliensimon/solar-system-moons.
Solar System Moons
<div align="center"> <img src="banner.jpg" alt="Jupiter's Great Red Spot and the Galilean satellites" width="400"> <p><em>Credit: NASA/JPL-Caltech</em></p> </div>
Part of a [dataset collection](https://huggingface.co/collections/juliensimon/planetary-science-datasets-68214dab0f1e965e6741fcd2) on Hugging Face.
Dataset description
Every known natural satellite of planets and dwarf planets in the Solar System with orbital elements, physical parameters, and discovery data. Sourced from NASA JPL Solar System Dynamics.
This dataset catalogs all recognized natural satellites orbiting the major planets (Earth through Neptune) and the dwarf planet Pluto, as maintained by NASA's Jet Propulsion Laboratory (JPL) Solar System Dynamics group. Each record combines discovery circumstances, mean orbital elements, and — where available — physical parameters (radius, density, gravitational parameter).
The dataset merges three authoritative JPL tables:
- Discovery circumstances — name, parent body, year, discoverer
- Mean orbital elements — semi-major axis, eccentricity, inclination, period
- Physical parameters — mean radius, GM, density (for major moons)
The natural satellites of the solar system span an extraordinary range of sizes, compositions, and dynamical histories. At one extreme, Jupiter's Ganymede (radius ~2,634 km) is larger than Mercury and possesses its own intrinsic magnetic field. At the other, many recently discovered irregular satellites are only a few kilometers across and occupy distant, highly inclined or retrograde orbits that betray their origin as captured objects from the primordial small-body population. The dynamical groupings recorded in this dataset — Galilean, Himalia, Ananke, Carme, Pasiphae for Jupiter; Inuit, Gallic, Norse for Saturn — reflect distinct capture and collisional fragmentation events that occurred during the chaotic early evolution of the giant planet systems.
Several moons in this catalog are among the most scientifically compelling worlds in the solar system. Europa's subsurface ocean beneath its icy shell is a prime target for astrobiology, while Enceladus actively vents water vapor and organic molecules through its south polar tiger stripes. Titan maintains a dense nitrogen-methane atmosphere with a complete hydrological cycle of methane rain, rivers, and lakes. Io is the most volcanically active body known, driven by intense tidal heating from its orbital resonance with Europa and Ganymede. Triton, captured by Neptune from the Kuiper Belt, exhibits active nitrogen geysers and a retrograde orbit that is gradually decaying.
The orbital elements in this dataset encode fundamental information about satellite dynamics: resonant relationships (such as the 1:2:4 Laplace resonance of Io, Europa, and Ganymede), tidal evolution timescales, and the stability boundaries that separate regular from irregular satellite populations. Combined with physical parameters like density and radius, these data enable studies of satellite formation, internal structure, and the delivery of volatiles to the outer solar system.
Schema
Quick stats
- 450 total moons
- Saturn: 285 moons
- Jupiter: 111 moons
- Uranus: 30 moons
- Neptune: 16 moons
- Pluto: 5 moons
- Mars: 2 moons
- Earth: 1 moons
- 439 moons with orbital elements
- 46 moons with measured radius
- 297 retrograde moons (inclination > 90°)
- Largest moon: Ganymede (Jupiter, radius 2,631.2 km)
Usage
from datasets import load_dataset
import matplotlib.pyplot as plt
ds = load_dataset("juliensimon/solar-system-moons", split="train")
df = ds.to_pandas()
# Moons per planet
print(df["parent_body"].value_counts())
# Galilean moons of Jupiter
galilean = df[df["group"] == "Galilean"]
# Retrograde irregular satellites
retro = df[df["is_retrograde"] == True].sort_values("orbital_period_days")
# Largest moons by radius
biggest = df.dropna(subset=["mean_radius_km"]).nlargest(10, "mean_radius_km")
# Plot moon sizes by planet
fig, ax = plt.subplots(figsize=(10, 6))
for planet in ["Jupiter", "Saturn", "Uranus", "Neptune"]:
subset = df[(df["parent_body"] == planet) & df["mean_radius_km"].notna()]
ax.scatter(subset["semi_major_axis_km"] / 1e6, subset["mean_radius_km"],
label=planet, alpha=0.7, s=40)
ax.set_xlabel("Semi-major axis (million km)")
ax.set_ylabel("Mean radius (km)")
ax.set_title("Moon size vs. orbital distance")
ax.set_xscale("log")
ax.set_yscale("log")
ax.legend()
plt.tight_layout()
plt.show()
# Recent discoveries (2020+)
recent = df[df["discovery_year"] >= 2020]Data source
https://ssd.jpl.nasa.gov/sats/discovery.html
Related datasets
Citation
@dataset{solar_system_moons,
title = {Solar System Moons},
author = {Simon, Julien},
year = {2026},
url = {https://huggingface.co/datasets/juliensimon/solar-system-moons},
publisher = {Hugging Face},
note = {Derived from NASA JPL Solar System Dynamics, https://ssd.jpl.nasa.gov/sats/discovery.html}
}