Skip to main content

A high-precision, open-source astronomical ephemeris library for Python, powered by Skyfield.

Project description

LibEphemeris

PyPI Downloads PyPI Downloads PyPI Downloads PyPI Version Python Versions License

A high-precision astronomical ephemeris library for Python, powered by NASA JPL DE440/DE441 ephemerides and IAU 2006/2000A standards.

Drop-in replacement for PySwissEph - pure Python, no C extensions, easier deployment.


Features

  • NASA JPL DE440/DE441 - modern planetary ephemerides via Skyfield, with full-range DE441 support for deep-history and far-future work
  • IAU 2006/2000A standards - precession, nutation, and obliquity via the official ERFA library
  • Validated high precision - planetary differences typically measured in fractions of an arcsecond, house cusps < 0.02", benchmarked across 4,400+ comparison rounds (full report)
  • Four backends, one API - Skyfield, LEB (~14x speedup), Horizons API, and adaptive auto mode through the same calc_ut() interface
  • 25 house systems, 43 ayanamsha modes - independently verified against pyswisseph
  • Physical planet centers - outer planets corrected from barycenters using JPL satellite ephemerides
  • Thread-safe contexts when you need them - SwissEph-compatible globals for drop-in migration, EphemerisContext for concurrent workloads
  • 15,000+ years of coverage - base, medium, and extended precision tiers from modern use to -13200 / +17191 CE
  • Pure Python 3.12+ - no C extensions, clean installs across CI, containers, and serverless

Why LibEphemeris

Swiss Ephemeris is the industry standard for planetary calculations. But its Python binding (pyswisseph) is a C extension - hard to build, hard to debug, tied to a single computation model.

LibEphemeris provides the same API with a modern foundation:

  • NASA JPL ephemerides instead of semi-analytical theory - DE440/DE441 are the latest planetary ephemerides from the Jet Propulsion Laboratory, the same data used for spacecraft navigation.
  • IAU 2006/2000A standards - precession and nutation computed via the official ERFA library (the open-source implementation of IAU SOFA), not custom routines.
  • Physical planet centers - Jupiter, Saturn, Uranus, Neptune corrected from system barycenters to actual body centers using JPL satellite ephemerides. Most libraries skip this.
  • Independently verified - every function cross-validated against pyswisseph, JPL Horizons, and astropy/ERFA. Precision report with full methodology.
  • Pure Python - readable source, standard debugging, no build toolchain. Runs on any platform, any CI, any serverless environment.

Switching from pyswisseph? Your existing code works with minimal changes. Migration guide.


Quick Start

import libephemeris as swe
from libephemeris.constants import SE_SUN, SE_MOON, SEFLG_SPEED

jd = swe.julday(2000, 1, 1, 12.0)  # J2000.0

sun, _ = swe.calc_ut(jd, SE_SUN, SEFLG_SPEED)
moon, _ = swe.calc_ut(jd, SE_MOON, SEFLG_SPEED)

print(f"Sun:  {sun[0]:.4f} deg, speed {sun[3]:.4f} deg/day")
print(f"Moon: {moon[0]:.4f} deg, speed {moon[3]:.4f} deg/day")
# House cusps (Placidus, Rome)
cusps, ascmc = swe.houses(swe.julday(2024, 11, 5, 18.0), 41.9028, 12.4964, b"P")
print(f"ASC: {ascmc[0]:.4f}, MC: {ascmc[1]:.4f}")

For concurrent or multi-threaded workloads, use EphemerisContext instead of the module-level global state.

More examples: Getting Started


Verified Precision

Every number independently measured against pyswisseph across 4,400+ comparison rounds. Full report.

Category Typical Max Scope
Sun-Pluto 0.04-0.26" 1.17" Pluto max 0.75"; Neptune is the widest observed planetary delta
Moon 0.70" 3.32" Different underlying lunar models
House cusps < 0.01" 0.02" All 25 systems
Fixed stars < 0.1" 0.51" 116 Hipparcos catalog stars
Solar eclipses - < 6s Timing accuracy
Lunar eclipses - < 8s Timing accuracy
Ayanamsha < 0.001 deg 0.006 deg All 43 sidereal modes

Four Backends, One API

Choose your trade-off between speed, locality, and setup. The same calc_ut() interface works across all four modes, from zero-install Horizons lookups to precomputed LEB throughput.

Mode Backend Speed Use case
"auto" LEB -> Horizons -> Skyfield adaptive Default. Best onboarding; resolves local or remote data transparently
"skyfield" JPL DE440/DE441 via Skyfield ~120 us High-precision local JPL workflow
"leb" Precomputed Chebyshev polynomials ~5 us Maximum throughput for repeated calculations
"horizons" NASA JPL Horizons REST API ~300 ms No local ephemeris files required
from libephemeris import set_calc_mode
set_calc_mode("leb")  # or via env: LIBEPHEMERIS_MODE=leb

Installation

pip install libephemeris

Out of the box, the wheel includes a bundled LEB2 base-tier core for the 14 core bodies (1850-2150). With the default medium tier, the library can auto-download the additional LEB2 data it needs on first use.

Recommended first-time setup:

libephemeris init                 # Optional but recommended interactive config
libephemeris download auto        # Download exactly what your config needs
libephemeris status               # Verify installed data and active setup

Prefer to install a tier directly? Use one of these:

libephemeris download base         # 1850-2150, lightweight
libephemeris download medium       # 1550-2650, ~200 MB (recommended)
libephemeris download extended     # -13200 to +17191 CE, full range

Optional extras: pip install libephemeris[stars] for star-catalog tooling, [nbody] for REBOUND/ASSIST n-body integration, [all] for everything. Details.


Documentation


Contributing

git clone https://github.com/g-battaglia/libephemeris.git
cd libephemeris && uv pip install -e ".[dev]"
poe lint                           # Ruff lint + auto-fix
poe test:leb:fast                  # Recommended fast unit suite
poe test:compare:skyfield          # Cross-validate vs pyswisseph

Part of the Kerykeion Ecosystem

LibEphemeris is the computation engine behind:

  • Astrologer Studio — professional online astrology software (in production)
  • Kerykeion — Python astrology library (v6 alpha)
  • Astrologer API — hosted REST API for astrology data and SVG charts (upcoming)

Learn more at kerykeion.net.


License

AGPL-3.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

libephemeris-1.2.0.tar.gz (12.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

libephemeris-1.2.0-py3-none-any.whl (12.4 MB view details)

Uploaded Python 3

File details

Details for the file libephemeris-1.2.0.tar.gz.

File metadata

  • Download URL: libephemeris-1.2.0.tar.gz
  • Upload date:
  • Size: 12.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for libephemeris-1.2.0.tar.gz
Algorithm Hash digest
SHA256 930ca6fb9edf3df3ea9ff74d92886d626f17f993f9265e4990c7d365f9186caf
MD5 120ef65bc4cb61e34eb95401cd78cab9
BLAKE2b-256 ad52ba4fcdf44c07b60afcdf51d22e87c706da4c0da75dcb85879309c75a6633

See more details on using hashes here.

File details

Details for the file libephemeris-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: libephemeris-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 12.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for libephemeris-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b032a42a0b84f267a88f3a97697d9d6706be3bb7979e923fce759e780ec5152a
MD5 05f60cdac1a2092aa78e64ddd032c76a
BLAKE2b-256 812c7951f656abbd89f2a7275ffa85f9a9ad5e7a0dd298d9ae47f97f32a89e24

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page