Astropy Fundamentals
Master Astropy, the foundational Python library for astronomy and astrophysics. Learn to work with astronomical data formats, coordinate systems, physical units, precise time calculations, and scientific tables - the essential toolkit for modern astronomical computing.
Official Documentation: https://docs.astropy.org/en/stable/
GitHub: https://github.com/astropy/astropy
Quick Reference Card
Installation & Setup
# Using pixi (recommended for scientific projects) pixi add astropy photutils specutils # Using pip pip install astropy[all] # Optional affiliated packages pixi add photutils specutils astroquery reproject
Essential Operations
import astropy.units as u
from astropy.io import fits
from astropy.coordinates import SkyCoord
from astropy.time import Time
from astropy.table import Table, QTable
from astropy.wcs import WCS
# Units and Quantities
distance = 10 * u.parsec
wavelength = 5000 * u.angstrom
freq = wavelength.to(u.Hz, equivalencies=u.spectral())
# FITS I/O
with fits.open('image.fits') as hdul:
data = hdul[0].data
header = hdul[0].header
# Coordinates
coord = SkyCoord(ra=10.625*u.degree, dec=41.2*u.degree, frame='icrs')
galactic = coord.galactic
separation = coord.separation(other_coord)
# Time
t = Time('2024-01-01T00:00:00', format='isot', scale='utc')
jd = t.jd
future = t + 1*u.day
# Tables
tbl = Table([ra_col, dec_col, flux_col], names=['ra', 'dec', 'flux'])
filtered = tbl[tbl['flux'] > 100]
# WCS
wcs = WCS(header)
ra, dec = wcs.pixel_to_world(x_pix, y_pix)
Quick Decision Tree
Working with astronomical data? ├─ FITS files → astropy.io.fits ├─ Celestial coordinates → astropy.coordinates (SkyCoord) ├─ Physical quantities → astropy.units ├─ Astronomical time → astropy.time ├─ Catalogs/tables → astropy.table ├─ Image coordinates → astropy.wcs ├─ Photometry → photutils └─ Spectroscopy → specutils Need coordinate transformation? ├─ Simple conversions → SkyCoord.transform_to() ├─ Sky separations → SkyCoord.separation() ├─ Matching catalogs → match_to_catalog_sky() └─ Custom frames → Define new frame class Working with units? ├─ Standard units → multiply by u.unit ├─ Unit conversions → quantity.to() ├─ Wavelength/frequency → Use u.spectral() equivalency └─ Dimensionless → quantity.decompose() Need precise time? ├─ Single instant → Time() ├─ Arrays of times → Time(array) ├─ Time scales → specify scale='utc', 'tai', etc. └─ Time formats → specify format='jd', 'isot', etc.
When to Use This Skill
Use Astropy fundamentals when working with:
- •FITS files from telescopes, surveys, or simulations
- •Celestial coordinates requiring precise transformations between reference frames
- •Physical quantities with units (distances, velocities, energies, magnitudes)
- •Astronomical time needing sub-nanosecond precision or specific time scales
- •Catalogs and tables from surveys, observations, or simulations
- •Image astrometry relating pixel positions to sky coordinates
- •Photometric analysis of point sources or aperture measurements
- •Spectroscopic data requiring wavelength calibration or line analysis
- •Multi-wavelength astronomy combining data across electromagnetic spectrum
- •Observational planning calculating rise/set times, airmass, visibility
Core Concepts
1. Units and Quantities
Physical quantities with dimensional correctness. Attach units to values and convert automatically.
Key operations:
- •Create:
distance = 10 * u.parsec - •Convert:
distance.to(u.lightyear) - •Equivalencies:
wavelength.to(u.Hz, equivalencies=u.spectral()) - •Arithmetic: Units propagate automatically
See references/PATTERNS.md for custom units, logarithmic units, and advanced equivalencies.
2. FITS I/O
Standard format for astronomical data. Read/write images and tables with headers.
Key operations:
- •Open:
fits.open('file.fits')with context manager - •Access:
hdul[0].data,hdul[0].header - •Headers: Dictionary-like access, add comments
- •Memory mapping:
fits.open('file.fits', memmap=True)for large files
See references/PATTERNS.md for multi-extension FITS, header inheritance, and large file handling.
3. Coordinates
Celestial positions with automatic frame transformations.
Key operations:
- •Create:
SkyCoord(ra=10*u.deg, dec=20*u.deg, frame='icrs') - •Transform:
coord.galactic,coord.transform_to('fk5') - •Separations:
coord1.separation(coord2) - •Matching:
coord.match_to_catalog_sky(catalog)
See references/PATTERNS.md for custom frames, catalog cross-matching, and observer-dependent coordinates.
4. Time
Sub-nanosecond precision with multiple time scales and formats.
Key operations:
- •Create:
Time('2024-01-01', scale='utc') - •Formats:
.jd,.mjd,.iso,.datetime - •Scales:
.utc,.tai,.tt,.tdb - •Arithmetic:
t + 1*u.day
See references/PATTERNS.md for high-precision calculations, time series, and barycentric corrections.
5. Tables
Flexible tabular data with units and metadata.
Key operations:
- •Create:
Table([col1, col2], names=['a', 'b']) - •QTable: Preserves Quantity units
- •Filter:
tbl[tbl['mag'] < 15] - •Join:
join(tbl1, tbl2, keys='id') - •I/O:
.read(),.write()for FITS, CSV, HDF5
See references/PATTERNS.md for masked tables, joins, metadata, and indexing.
6. WCS (World Coordinate System)
Maps pixel coordinates to sky coordinates.
Key operations:
- •Load:
WCS(header) - •Pixel→Sky:
wcs.pixel_to_world(x, y)returns SkyCoord - •Sky→Pixel:
wcs.world_to_pixel(coord) - •Legacy:
wcs.all_pix2world(x, y, 0)for arrays
See references/PATTERNS.md for creating WCS, SIP distortions, and cutouts.
7. Photometry (Photutils)
Source detection and aperture photometry.
Key operations:
- •Detect:
DAOStarFinder(fwhm=3.0, threshold=5*std) - •Aperture:
CircularAperture(positions, r=5.0) - •Measure:
aperture_photometry(image, apertures) - •Background: Use
CircularAnnulusfor local background
See references/PATTERNS.md for PSF photometry and grouped sources.
8. Spectroscopy (Specutils)
1D spectroscopy with wavelength calibration and line analysis.
Key operations:
- •Create:
Spectrum1D(spectral_axis=wavelength, flux=flux) - •Read:
Spectrum1D.read('spec.fits') - •Convert:
.with_spectral_axis_unit(u.Hz) - •Lines:
line_flux(spectrum, region)
See references/PATTERNS.md for line fitting, continuum normalization, and redshift measurement.
Patterns
See references/PATTERNS.md for detailed patterns including:
FITS Manipulation:
- •Multi-extension FITS handling
- •Header inheritance and propagation
- •Large file processing with memory mapping
- •Updating headers without loading data
Units and Quantities:
- •Custom unit definitions
- •Logarithmic units (magnitudes, decibels)
- •Spectral equivalencies (wavelength/frequency/energy)
- •Structured arrays with units
Coordinates:
- •Custom coordinate frames
- •Efficient catalog cross-matching
- •Observer-dependent coordinates (AltAz)
- •Proper motion and radial velocity
Time:
- •High-precision time arithmetic
- •Time series analysis and folding
- •Time zone handling
- •Barycentric corrections
Tables:
- •Masked tables for missing data
- •Multi-key joins
- •Table metadata and descriptions
- •Fast indexing for large tables
WCS:
- •Creating WCS from astrometry solutions
- •SIP distortion polynomials
- •Cutouts with WCS preservation
Photometry:
- •PSF photometry
- •Grouped source photometry
- •Background subtraction strategies
Spectroscopy:
- •Spectral line fitting
- •Continuum normalization
- •Redshift measurement via cross-correlation
Real-World Examples
See references/EXAMPLES.md for complete workflows:
- •
Telescope Image Processing Pipeline: FITS loading → background subtraction → source detection → aperture photometry → catalog creation with WCS
- •
Catalog Cross-Matching: Multi-catalog matching with coordinate transformations, quality filtering, and color calculations
- •
Light Curve Analysis: Time series handling, period search with Lomb-Scargle, phase folding, and binning
- •
Multi-Wavelength SED Construction: Combining multi-band photometry with proper unit handling and flux conversions
- •
Spectroscopic Redshift Measurement: Emission line identification, template cross-correlation, and redshift refinement
- •
Observability Calculation: Target visibility from specific location, airmass calculation, sun/moon constraints
Common Issues and Solutions
See references/COMMON_ISSUES.md for troubleshooting:
FITS I/O Issues:
- •VerifyError with non-standard FITS
- •Memory errors with large files
- •Compressed FITS handling
Unit Problems:
- •UnitConversionError between incompatible units
- •Losing units after NumPy operations
- •Logarithmic unit confusion
Coordinate Issues:
- •Frame attribute mismatches
- •AltAz requiring location and time
- •Slow coordinate transformations
Time Issues:
- •Time scale confusion (UTC vs TAI vs TDB)
- •ISO format parsing ambiguity
- •Precision loss in calculations
Table Issues:
- •Column type mismatches
- •Units lost when writing to CSV
- •Joining tables with different column names
WCS Problems:
- •WCS transformations giving NaN
- •Pixel origin convention confusion (origin=0 vs origin=1)
- •SIP distortion handling
Performance:
- •Out of memory with large FITS files
- •Slow operations on large catalogs
- •Vectorization strategies
Best Practices Checklist
Units and Quantities
- •Always attach units to physical quantities
- •Use
.to()for explicit conversions - •Leverage equivalencies for wavelength/frequency/energy
- •Decompose complex units to verify correctness
FITS Files
- •Use context managers (
with fits.open()) for safe file handling - •Include descriptive header keywords with comments
- •Use
memmap=Truefor files larger than RAM - •Validate headers before writing
Coordinates
- •Use SkyCoord for all coordinate operations
- •Specify frames explicitly
- •Use catalog matching instead of manual loops
- •Cache transformations for repeated use
Time
- •Specify both format and scale when creating Time objects
- •Use appropriate time scale for your science (UTC for observations, TDB for dynamics)
- •Work in arrays for efficiency
- •Document time system in metadata
Tables
- •Use QTable to preserve units
- •Add metadata (descriptions, units) to columns
- •Index tables for fast lookups
- •Use masked columns for missing data
Performance
- •Work with arrays instead of loops
- •Use lazy loading for large FITS files
- •Cache expensive computations
- •Profile before optimizing
Resources and References
Official Documentation
- •Astropy Documentation: https://docs.astropy.org/en/stable/
- •Astropy Tutorials: https://learn.astropy.org/
- •Photutils: https://photutils.readthedocs.io/
- •Specutils: https://specutils.readthedocs.io/
Core Modules
- •astropy.io.fits: https://docs.astropy.org/en/stable/io/fits/
- •astropy.units: https://docs.astropy.org/en/stable/units/
- •astropy.coordinates: https://docs.astropy.org/en/stable/coordinates/
- •astropy.time: https://docs.astropy.org/en/stable/time/
- •astropy.table: https://docs.astropy.org/en/stable/table/
- •astropy.wcs: https://docs.astropy.org/en/stable/wcs/
Community
- •Astropy Discourse: https://community.openastronomy.org/c/astropy
- •GitHub Issues: https://github.com/astropy/astropy/issues
- •Stack Overflow: Tag
astropy
Summary
Astropy is the foundational library for astronomical computing in Python, providing essential tools for FITS files, coordinates, units, time, tables, and more.
Key takeaways:
- •Units: Always attach physical units to prevent dimensional errors
- •FITS I/O: Standard format for astronomical images and tables
- •Coordinates: SkyCoord simplifies transformations between reference frames
- •Time: Sub-nanosecond precision with multiple scales and formats
- •Tables: Flexible tabular data with unit and metadata support
- •WCS: Maps pixel coordinates to sky positions
- •Photutils: Source detection and aperture photometry
- •Specutils: 1D spectroscopy with wavelength calibration
Progressive Learning Path:
- •Start with FITS I/O and tables for basic data handling
- •Learn units and quantities for physical calculations
- •Master coordinates for astrometry and sky matching
- •Explore time handling for time-series analysis
- •Use WCS for image astrometry
- •Apply photutils for source extraction
- •Add specutils for spectroscopic analysis
For detailed patterns, complete examples, and troubleshooting, see the reference files in the references/ directory.