A Python wrapper for the NAIF CSPICE Toolkit providing essential tools for spacecraft navigation and planetary science calculations
Time correlation functions for converting between spacecraft clock time and other time systems. Spacecraft clocks provide the primary time reference for mission operations, and these functions enable translation between spacecraft time and standard time systems like Ephemeris Time (ET) and UTC.
Convert spacecraft clock strings and ticks to ephemeris time.
def scs2e(sc: int, sclkch: str) -> float:
"""
Convert spacecraft clock string to ephemeris time.
Parameters:
- sc: int, spacecraft ID
- sclkch: str, spacecraft clock string
Returns:
float: ephemeris time (seconds past J2000)
"""
def sct2e(sc: int, sclkdp: float) -> float:
"""
Convert spacecraft clock ticks to ephemeris time.
Parameters:
- sc: int, spacecraft ID
- sclkdp: float, spacecraft clock ticks
Returns:
float: ephemeris time (seconds past J2000)
"""Convert ephemeris time to spacecraft clock format.
def sce2s(sc: int, et: float) -> str:
"""
Convert ephemeris time to spacecraft clock string.
Parameters:
- sc: int, spacecraft ID
- et: float, ephemeris time
Returns:
str: spacecraft clock string
"""
def sce2t(sc: int, et: float) -> float:
"""
Convert ephemeris time to spacecraft clock ticks.
Parameters:
- sc: int, spacecraft ID
- et: float, ephemeris time
Returns:
float: spacecraft clock ticks
"""
def sce2c(sc: int, et: float) -> float:
"""
Convert ephemeris time to continuous spacecraft clock ticks.
Parameters:
- sc: int, spacecraft ID
- et: float, ephemeris time
Returns:
float: continuous spacecraft clock ticks
"""Format and decode spacecraft clock strings.
def scfmt(sc: int, ticks: float) -> str:
"""
Format spacecraft clock ticks as string.
Parameters:
- sc: int, spacecraft ID
- ticks: float, spacecraft clock ticks
Returns:
str: formatted spacecraft clock string
"""
def scencd(sc: int, sclkch: str) -> float:
"""
Encode spacecraft clock string to ticks.
Parameters:
- sc: int, spacecraft ID
- sclkch: str, spacecraft clock string
Returns:
float: spacecraft clock ticks
"""
def scdecd(sc: int, sclkdp: float) -> str:
"""
Decode spacecraft clock ticks to string.
Parameters:
- sc: int, spacecraft ID
- sclkdp: float, spacecraft clock ticks
Returns:
str: spacecraft clock string
"""Query spacecraft clock parameters and metadata.
def scpart(sc: int) -> Tuple[int, ndarray, ndarray]:
"""
Get spacecraft clock partition information.
Parameters:
- sc: int, spacecraft ID
Returns:
Tuple[int, ndarray, ndarray]: (nparts, pstart, pstop)
- nparts: number of partitions
- pstart: partition start times
- pstop: partition stop times
"""
def sctiks(sc: int, clkstr: str) -> float:
"""
Convert spacecraft clock string to ticks.
Parameters:
- sc: int, spacecraft ID
- clkstr: str, spacecraft clock string
Returns:
float: number of ticks
"""
def scard(cell: SpiceCell) -> int:
"""
Get spacecraft clock cardinality (number of elements).
Parameters:
- cell: SpiceCell, spacecraft clock cell
Returns:
int: number of elements in cell
"""import spiceypy as spice
# Load required kernels
spice.furnsh("spacecraft_sclk.tsc") # Spacecraft clock kernel
spice.furnsh("leapseconds.tls") # Leap seconds kernel
spacecraft_id = -123
# Convert ephemeris time to spacecraft clock
et = spice.str2et("2023-01-01T12:00:00")
sclk_string = spice.sce2s(spacecraft_id, et)
sclk_ticks = spice.sce2t(spacecraft_id, et)
print(f"ET: {et}")
print(f"SCLK string: {sclk_string}")
print(f"SCLK ticks: {sclk_ticks}")
# Convert spacecraft clock back to ephemeris time
et_converted = spice.scs2e(spacecraft_id, sclk_string)
et_from_ticks = spice.sct2e(spacecraft_id, sclk_ticks)
print(f"ET from string: {et_converted}")
print(f"ET from ticks: {et_from_ticks}")import spiceypy as spice
# Get spacecraft clock partition information
spacecraft_id = -123
nparts, pstart, pstop = spice.scpart(spacecraft_id)
print(f"Spacecraft {spacecraft_id} has {nparts} clock partitions:")
for i in range(nparts):
start_et = spice.sct2e(spacecraft_id, pstart[i])
stop_et = spice.sct2e(spacecraft_id, pstop[i])
start_utc = spice.et2utc(start_et, "C", 0)
stop_utc = spice.et2utc(stop_et, "C", 0)
print(f" Partition {i}: {start_utc} to {stop_utc}")
print(f" Ticks: {pstart[i]} to {pstop[i]}")import spiceypy as spice
spacecraft_id = -123
# Get current spacecraft clock time
et_now = spice.str2et("2023-06-15T14:30:00")
sclk_ticks = spice.sce2t(spacecraft_id, et_now)
# Format in different ways
sclk_string = spice.scfmt(spacecraft_id, sclk_ticks)
decoded_string = spice.scdecd(spacecraft_id, sclk_ticks)
print(f"SCLK ticks: {sclk_ticks}")
print(f"Formatted SCLK: {sclk_string}")
print(f"Decoded SCLK: {decoded_string}")
# Parse spacecraft clock string to ticks
parsed_ticks = spice.scencd(spacecraft_id, sclk_string)
ticks_from_sctiks = spice.sctiks(spacecraft_id, sclk_string)
print(f"Parsed ticks (scencd): {parsed_ticks}")
print(f"Parsed ticks (sctiks): {ticks_from_sctiks}")import spiceypy as spice
spacecraft_id = -123
# Convert to continuous spacecraft clock (handles partition boundaries)
et = spice.str2et("2023-01-01T12:00:00")
continuous_ticks = spice.sce2c(spacecraft_id, et)
print(f"ET: {et}")
print(f"Continuous SCLK ticks: {continuous_ticks}")
# Note: Continuous ticks can span partition boundaries
# unlike regular ticks which reset at each partitionimport spiceypy as spice
import numpy as np
spacecraft_id = -123
# Convert multiple times
times_utc = [
"2023-01-01T00:00:00",
"2023-01-01T06:00:00",
"2023-01-01T12:00:00",
"2023-01-01T18:00:00",
"2023-01-02T00:00:00"
]
print("Time conversion table:")
print("UTC ET SCLK String SCLK Ticks")
print("-" * 70)
for utc_str in times_utc:
et = spice.str2et(utc_str)
sclk_str = spice.sce2s(spacecraft_id, et)
sclk_ticks = spice.sce2t(spacecraft_id, et)
print(f"{utc_str} {et:12.3f} {sclk_str:12s} {sclk_ticks:12.3f}")import spiceypy as spice
spacecraft_id = -123
try:
# Attempt conversion that might fail
et = spice.str2et("2025-01-01T12:00:00") # Future time
sclk_string = spice.sce2s(spacecraft_id, et)
print(f"Conversion successful: {sclk_string}")
except spice.SpiceyError as e:
print(f"Clock conversion failed: {e}")
print("This might happen if:")
print(" - SCLK kernel doesn't cover the requested time")
print(" - Spacecraft ID is invalid")
print(" - Required kernels aren't loaded")Install with Tessl CLI
npx tessl i tessl/pypi-spiceypydocs