Как рассчитать угол наклона солнца над горизонтом с помощью pyEphem

Я новичок в PyEphem, и это, вероятно, простой вопрос. Я хочу рассчитать угол наклона солнца над горизонтом в определенную точку и дату GPS. Мой код выглядит следующим образом:

import ephem
import datetime

date = datetime.datetime(2010,1,1,12,0,0)
print "Date: " + str(date)

obs=ephem.Observer()
obs.lat='31:00'
obs.long='-106:00'
obs.date = date
print obs

sun = ephem.Sun(obs)
sun.compute(obs)
print float(sun.alt)
print str(sun.alt)
sun_angle = float(sun.alt) * 57.2957795 # Convert Radians to degrees
print "sun_angle: %f" % sun_angle

И результат:

python sunTry.py
Date: 2010-01-01 12:00:00
<ephem.Observer date='2010/1/1 12:00:00' epoch='2000/1/1 12:00:00' lon=-106:00:00.0 lat=31:00:00.0 elevation=0.0m horizon=0:00:00.0 temp=15.0C pressure=1010.0mBar>
-0.44488877058
-25:29:24.9
sun_angle: -25.490249

Почему alt отрицательный? Местоположение GPS находится где-то в Мексике, и я указал 12 часов дня в параметре даты наблюдателя. Солнце должно быть в значительной степени прямо над головой, поэтому я мог подумать, что переменная alt вернет угол где-то в диапазоне от 70 до 90 градусов? Что мне здесь не хватает?

Спасибо

Стивен


person user2669257    schedule 09.08.2013    source источник
comment
Моя память немного нечеткая с использованием datetime. Возможно ли, что там проблема с часовым поясом? Может быть, ephem и datetime сговариваются интерпретировать ваше время как в другом часовом поясе, таком как UTC или ваш местный TZ?   -  person bob.sacamento    schedule 10.08.2013


Ответы (1)


Я считаю, что проблема в том, что в PyEphem даты всегда находятся в формате UTC. Итак, независимо от того, какой местный часовой пояс для широты и долготы вашего наблюдателя, если вы укажете полдень, это будет предполагать, что вы имеете в виду полдень по всемирному координированному времени. Это означает, что вы должны указать время, которое вы намереваетесь уже преобразовать в UTC.

Время UTC для «где-то в Мексике в datetime.datetime(2010,1,1,12,0,0)» составляет примерно datetime.datetime(2010,1,1,18,0,0).

С этой новой датой я получаю вывод

sun_angle: 33.672932

Это все еще кажется низким, но более разумным, чем -25.

Если вам нужен программный способ сделать это, вы можете (на свой страх и риск) вмешаться в модуль pytz.

tz_mexico = pytz.timezone('America/Mexico_City')
mexico_time = datetime.datetime(2010,1,1,12,0,0,0,tz_mexico)
utc_time = mexico_time.astimezone(pytz.utc)
obs.date = utc_time
person Brionius    schedule 10.08.2013