我使用ephem
首次,且无法理解oberver.sidereal_time的输出()pyephem恒星时给出了意想不到的结果
我已经写了几个脚本,以确定从小时角度太阳时。第一个使用ephem来计算赤经和Meeus的天文算法得到一个公式,得到格林威治的平均恒星时间,它可以被转换为与经度一起的局部平均恒星时间。
import sys
from datetime import datetime, time, timedelta
import ephem
def hour_angle(dt, longit, latit, elev):
obs = ephem.Observer()
obs.date = dt.strftime('%Y/%m/%d %H:%M:%S')
obs.lon = longit
obs.lat = latit
obs.elevation = elev
sun = ephem.Sun()
sun.compute(obs)
# get right ascention
ra = ephem.degrees(sun.g_ra)
# get sidereal time at greenwich (AA ch12)
jd = ephem.julian_date(dt)
t = (jd - 2451545.0)/36525
theta = 280.46061837 + 360.98564736629 * (jd - 2451545) \
+ .000387933 * t**2 - t**3/38710000
# hour angle (AA ch13)
ha = (theta + longit - ra * 180/ephem.pi) % 360
return ha
def main():
if len(sys.argv) != 6:
print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]'
sys.exit()
else:
dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S')
longit = float(sys.argv[3])
latit = float(sys.argv[4])
elev = float(sys.argv[5])
# get hour angle
ha = hour_angle(dt, longit, latit, elev)
# convert hour angle to timedelta from noon
days = ha/360
if days > 0.5:
days -= 0.5
td = timedelta(days=days)
# make solar time
solar_time = datetime.combine(dt.date(), time(12)) + td
print solar_time
if __name__ == '__main__':
main()
这使得输出,当我插上一些数据,我希望:
> python hour_angle_ephem.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
2012-11-16 12:40:54.697115
我写的第二个脚本计算赤经相同的方式,但使用ephem的sidereal_time()获取本地明显恒星时间。
import sys
from datetime import datetime, time, timedelta
import math
import ephem
def solartime(observer, sun=ephem.Sun()):
sun.compute(observer)
# sidereal time == ra (right ascension) is the highest point (noon)
t = observer.sidereal_time() - sun.ra
return ephem.hours(t + ephem.hours('12:00')).norm # .norm for 0..24
def main():
if len(sys.argv) != 6:
print 'Usage: hour_angle.py [YYYY/MM/DD] [HH:MM:SS] [longitude] [latitude] [elev]'
sys.exit()
else:
dt = datetime.strptime(sys.argv[1] + ' ' + sys.argv[2], '%Y/%m/%d %H:%M:%S')
longit = float(sys.argv[3])
latit = float(sys.argv[4])
elev = float(sys.argv[5])
obs = ephem.Observer()
obs.date = dt.strftime('%Y/%m/%d %H:%M:%S')
obs.lon = longit
obs.lat = latit
obs.elevation = elev
solar_time = solartime(obs)
print solar_time
if __name__ == '__main__':
main()
这不会让我输出我期望的。
python hour_angle_ephem2.py 2012/11/16 20:34:56 -122.2697 37.8044 3.0
9:47:50.83
AFAIK,两个脚本之间的唯一区别是,第一碱基时角上的本地平均恒星时,而第二个碱基时角上局部明显恒星时,其考虑了地球的章动,我认为这应该是一个非常小的因素。相反,我看到大约三个小时的差异。任何人都可以向我解释发生了什么事?
注:在'solartime()'函数是从我的答案](http://stackoverflow.com/a/13425515/ 4279)。可以使用它,但是你必须提供适当的参考(指向答案的链接就足够了),因为[许可说](http://creativecommons.org/licenses/by-sa/3.0/) – jfs
btw,[答案](http://stackoverflow.com/a/13425515/4279)明确表示如果使用float,则应该使用弧度作为经度。 – jfs
我的不好,我没有阅读许可证。我赞成你的答案。 – mattexx