Solución:
El mediodía solar es no la media de la salida y la puesta del sol (ver la ecuación de tiempo para la explicación). los ephem
El paquete tiene métodos para obtener tiempos de tránsito que debería usar en su lugar:
>>> import ephem
>>> o = ephem.Observer()
>>> o.lat, o.long = '37.0625', '-95.677068'
>>> sun = ephem.Sun()
>>> sunrise = o.previous_rising(sun, start=ephem.now())
>>> noon = o.next_transit(sun, start=sunrise)
>>> sunset = o.next_setting(sun, start=noon)
>>> noon
2010/11/6 18:06:21
>>> ephem.date((sunrise + sunset) / 2)
2010/11/6 18:06:08
Tenga en cuenta que el mediodía de hoy es 13 segundos más tarde (en su ubicación) que la media del amanecer y el atardecer.
(La línea de código ephem.date((sunrise + sunset) / 2)
muestra cómo se pueden manipular fácilmente las fechas en el ephem
paquete, si fuera lo correcto.)
Si usar ephem no es un requisito estricto, recientemente escribí una biblioteca llamada daylight que tiene una función nativa para el mediodía solar directamente.
>>> import daylight, pytz
>>> from datetime import datetime
>>> sun = daylight.Sunclock(37.0625, -95.677068)
>>> t = sun.solar_noon(datetime.utcnow().timestamp())
>>> datetime.utcfromtimestamp
datetime.datetime(2020, 6, 4, 18, 20, 54)
No es que el tiempo anterior esté en UTC. Para una zona horaria más apropiada, digamos EST, puede hacer:
>>> tz = pytz.timezone('EST')
>>> tz_offset = tz.utcoffset(datetime.utcnow()).total_seconds()/3600
>>> sun = daylight.Sunclock(37.0625, -95.677068, tz_offset)
>>> t = sun.solar_noon(datetime.utcnow().timestamp())
>>> datetime.utcfromtimestamp
datetime.datetime(2020, 6, 3, 7, 50, 54, tzinfo=<StaticTzInfo 'EST'>)
o haga esto para una fecha en particular, digamos 21 de mayo de 2020
>>> t = sun.solar_noon(datetime(2020, 5, 21).timestamp())
>>> datetime.utcfromtimestamp
datetime.datetime(2020, 5, 20, 18, 19, 14)