PyEphem

You are currently browsing articles tagged PyEphem.

Quería saber cual iba a ser el número de horas de sol que tendría en Edimburgo a lo largo del año, vamos, lo que viene a ser la duración del día. Gracias al software libre, a las pilas incluidas con Python y a las que se pueden obtener fácilmente, he realizado un programa sencillito y rápido que indica y muestra gráficamente las horas de sol y las de puesta y salida del sol según el día del año. Aquí viene la descripción del programilla. Por cierto, me imagino el tiempo que me hubiera costado encontrar o calcular yo mismo esta información en la era pre-Internet y pre-Software libre y se me ponen los pelos de punta.

Lo primero es importar los módulos que usaremos: “ephem” (PyEphem) para los cálculos de las efemérides, “math” para usar operaciones matemáticas y “pylab” (Matplotlib) para pintar los resultados:

import ephem
import math
import pylab

En el ejemplo que vamos a ver se podría omitir el uso de math pero se mantiene por claridad.

Luego definimos el lugar de observación con las coordenadas de Edimburgo:

EDI = ephem.Observer()
EDI.lat = str(55+55.378/60)
EDI.long = str(-3-11.672/60)

Después definimos el sol:

sun = ephem.Sun()

Creamos una serie de tuplas vacías que vamos a ir rellenando con los datos que nos interesen para cada día del año:

date = []
salida = []
puesta = []
df = []
sf = []
pf = []
dia = []

En la variable “d” ponemos el primer día del año, al mediodía que es cuando cabe esperar (al menos en el caso de Edimburgo) que el sol esté por encima del horizonte:

d = ephem.Date('2010/01/01 12:00')

En la variable auxiliar “d0” metemos el valor del día eliminando la hora. Esto lo hacemos truncando el valor float de d y quedándonos solo con su parte entera. “dhoy” es el día del año de hoy, le restamos al valor de hoy el valor del primer día del año, ambos en días julianos, para obtener así el día del año:

d0 = math.trunc(d)
dhoy = EDI.date - d0

Cambiamos la fecha de Edimburgo a la del primer día del año:

EDI.date = d

Ahora es cuando ejecutamos un bucle para los 365 días del año en el que vamos rellenando el valor de las tuplas que definimos con anterioridad. Ponemos la fecha completa en “d”; cambiamos la fecha en Edimburgo a la del día “d”; ponemos la hora de salida del sol anterior a ese momento en “salida” y la de puesta posterior en “puesta”; en “df” ponemos la diferencia entre el día actual y el primer día del año, el día del año; en “sf” ponemos la hora de salida y en “pf” la de puesta, ambas en tiempo universal; en “dia” ponemos la duración del día y por último añadimos un día más:

for i in range(0,365):
  date.append(d)
  EDI.date = d
  salida.append(EDI.previous_rising(sun))
  puesta.append(EDI.next_setting(sun))
  df.append(math.trunc(d)-d0)
  sf.append(math.fmod(salida[-1].triple()[2],1)*24)
  pf.append(math.fmod(puesta[-1].triple()[2],1)*24)
  dia.append((puesta[-1]-salida[-1])*24)
  d = d + 1

La última parte es pintar los resultados. Creamos una figura compuesta de dos partes: la de arriba muestra las horas de salida y puesta del sol y, la segunda, muestra las horas del día:

pylab.figure()
pylab.subplot(211)
pylab.plot(df,sf,'b-')
pylab.plot(df,pf,'r-')
pylab.grid()
pylab.vlines([dhoy],0,24,color="g",linestyles='dashed')
pylab.ylim([0,24])
pylab.xlim([0,365])
pylab.ylabel("Hour")
pylab.xlabel("Day of the year")
pylab.subplot(212)
pylab.plot(df,dia,'k-')
pylab.vlines([dhoy],0,24,color="g",linestyles='dashed')
pylab.grid()
pylab.xlim([0,365])
pylab.ylim([6,18])
pylab.ylabel("Hours of Sun")
pylab.xlabel("Day of the year")
pylab.show()

El resultado es el siguiente:

Tiempo de sol Edimburgo

Como se puede ver el día dura de un poco menos de 7 horas en diciembre hasta las más de 17 horas y media a finales de junio.

Las figuras se pueden mejorar para mostrar los meses directamente en lugar del día del año. También se podría hacer un poco más interactivo dejando que usuario pudiera elegir el día del año. Quizás se podría integrar fácilmente en un programa gráfico con PyQt por ejemplo pero todo esto se deja para otra ocasión.

Tags: , ,