The following code computes the position of the sun (in azimuth/altitude coordinates) in the sky using the skyfield
library. Note that you need to download de421.bsp
.
from skyfield import api from skyfield import almanac from datetime import datetime from datetime import timedelta import dateutil.parser from calendar import monthrange ts = api.load.timescale() ephem = api.load_file('de421.bsp') sun = ephem["Sun"] earth = ephem["Earth"] # Compute sunrise & sunset for random location near Munich location = api.Topos('48.324777 N', '11.405610 E', elevation_m=519) # Compute the sun position as seen from the observer at <location> sun_pos = (earth + location).at(ts.now()).observe(sun).apparent() # Compute apparent altitude & azimuth for the sun's position altitude, azimuth, distance = sun_pos.altaz() # Print results (example) print(f"Altitude: {altitude.degrees:.4f} °") print(f"Azimuth: {azimuth.degrees:.4f} °")
Example output
Altitude: -3.3121 ° Azimuth: 48.4141 °
Factors influencing the accuracy of the calculation
This way of calculating the position takes into account:
- The slight shift in position caused by light speed
- The very very slight shift in position caused by earth’s gravity
But it does not take into account:
- Atmospheric distortions shifting the sun’s position
- The extent of the sun’s disk causing the sun to emanate not from a point but apparently from an area