2010-11-02 15 views
7

J'ai regardé les exemples ici sur l'utilisation de l'éphème pour calculer le lever et le coucher du soleil, et cela fonctionne très bien.Calculez "midi solaire" en utilisant l'éphème, en traduisant à l'heure locale

J'ai des problèmes lorsque j'essaie de calculer le point médian entre ces deux temps. Voici ce que j'ai:

import datetime 
import ephem 

o = ephem.Observer() 
o.lat, o.long, o.date = '37.0625', '-95.677068', datetime.datetime.utcnow() 
sun = ephem.Sun(o) 
print "sunrise:", o.previous_rising(sun), "UTC" 
print "sunset:",o.next_setting(sun), "UTC" 
print "noon:",datetime.timedelta((o.next_setting(sun)-o.previous_rising(sun))/2) 

Je reçois:

Lever du soleil: 02/11/2010 12:47:40 UTC
coucher du soleil: 02/11/2010 23:24:25 UTC
midi : 5: 18: 22.679044

Voilà où je suis coincé. Je suis un débutant python et franchement pas beaucoup d'un programmeur en général.

Toutes les suggestions seraient les bienvenues!

Répondre

7

midi solaire est pas la moyenne lever et coucher du soleil (voir equation of time pour l'explication). Le paquet a ephemmethods for getting transit times que vous devez utiliser à la place:

>>> 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 

Notez que midi aujourd'hui est de 13 secondes plus tard (à votre emplacement) que la moyenne du lever et du coucher du soleil.

(La ligne de code ephem.date((sunrise + sunset)/2) montre comment vous pouvez facilement manipuler les dates dans le package ephem, si elle était la bonne chose à faire.)

+0

Votre calcul de sunrise ne fonctionne pas si vous êtes assez au nord (ou au sud) que le soleil n'a pas augmenté aujourd'hui ... (par exemple aujourd'hui 8 juillet ., mais le dernier lever de soleil était le 17 mai :-) – thebjorn

+0

Oui, je vois le problème: 'ephem.AlwaysUpError: 'Sun' est toujours au-dessus de l'horizon au 07/7/2011 00: 04: 58» –

0

La moyenne de deux nombres est la somme des nombres divisée par deux, et non par la division de la longueur du jour par deux. Cela pourrait aussi si vous ajoutez cela au o.previous_rising (soleil), mais cela ne devrait être le même que la prise moyenne directe (ne devrait pas question que nous sommes des objets datetime averageing)

0

Je me rends compte que cela a été répondu depuis longtemps. Mais à partir de la réponse pour ceux qui peuvent utiliser n'importe quel code ou ne comprennent pas vraiment Python, il y a l'explication simple du but de l'équation du temps. Votre transit solaire moyen (midi) se produit à votre emplacement longitudinal. Cela signifie que, connaissant votre longitude, vous pouvez trouver votre transit solaire moyen en divisant votre longitude par 15.0 et en soustrayant cette valeur de 12, ce qui sera le résultat en GMT ou UTC si vous préférez, pour donner des heures décimales. Votre vrai transit solaire est le résultat de la soustraction de l'équation du temps de la moyenne. Normalement, vous aurez besoin de calculer cela de toute façon pour obtenir les heures de lever et de coucher du soleil, comme indiqué dans la formule wikipedia. Mais merci pour l'info du paquet python car j'ai un peu de mal avec le paquet sunpy. Il y a un grand programme sur bitbucket ici https://bitbucket.org/cmcqueen1975/sundials/wiki/Home