使用PyEphem计算日出和日落时间
可以用 PyEphem 来计算黎明、黄昏和日落的时间吗?我用 PyEphem 生成了白天和黑夜的时间,但没找到关于日落、黄昏和黎明的相关内容。
3 个回答
你可以试着把 horizon
参数设置为 低于地平线,这样可以根据不同的黄昏和黎明的定义来调整。
下面这个脚本会用PyEphem来计算日出、日落和黄昏的时间。注释部分会解释每一部分的作用。
import ephem
#Make an observer
fred = ephem.Observer()
#PyEphem takes and returns only UTC times. 15:00 is noon in Fredericton
fred.date = "2013-09-04 15:00:00"
#Location of Fredericton, Canada
fred.lon = str(-66.666667) #Note that lon should be in string format
fred.lat = str(45.95) #Note that lat should be in string format
#Elevation of Fredericton, Canada, in metres
fred.elev = 20
#To get U.S. Naval Astronomical Almanac values, use these settings
fred.pressure= 0
fred.horizon = '-0:34'
sunrise=fred.previous_rising(ephem.Sun()) #Sunrise
noon =fred.next_transit (ephem.Sun(), start=sunrise) #Solar noon
sunset =fred.next_setting (ephem.Sun()) #Sunset
#We relocate the horizon to get twilight times
fred.horizon = '-6' #-6=civil twilight, -12=nautical, -18=astronomical
beg_twilight=fred.previous_rising(ephem.Sun(), use_center=True) #Begin civil twilight
end_twilight=fred.next_setting (ephem.Sun(), use_center=True) #End civil twilight
调整地平线的位置是为了考虑光线在地球曲率周围的折射。PyEphem能够根据温度和气压更准确地计算这一点,但美国海军天文年鉴(USNAA)更倾向于忽略大气的影响,直接调整地平线的位置。我提到USNAA是因为它是一个权威的来源,可以用来检查这类计算的准确性。你也可以在NOAA的网站上核对答案。
需要注意的是,PyEphem使用的是协调世界时(UTC)。这意味着你需要把你的本地时间转换成UTC,然后再把UTC转换回本地时间,才能找到你想要的答案。在我写这个回答的时候,加拿大弗雷德里克顿所在的大西洋时间区(ADT)比UTC晚了3个小时。
为了好玩,我还加上了太阳正午的计算。注意,这个时间比你预期的要多出一个小时——这是因为我们使用了夏令时的缘故。
所有这些计算的结果是:
begin civil twilight: 2013/9/4 09:20:46
sunrise: 2013/9/4 09:51:25
noon: 2013/9/4 16:25:33
sunset: 2013/9/4 22:58:49
end civil twilight: 2013/9/4 23:29:22
注意,我们需要减去3个小时才能把结果转换到ADT时间区。
这个PyEphem的文档页面包含了上面提到的大部分内容,虽然我试图澄清一些我觉得困惑的地方,并把那个链接中的重要部分也放在这里的StackOverflow上。
关于黎明和黄昏,可以参考pyephem文档中的黄昏部分
简单来说,黎明和黄昏是指太阳的中心在地平线下的某个特定角度的时间;这个角度根据不同的定义而变化,民用、航海和天文学的黄昏分别使用6度、12度和18度。
而日出则是指太阳的边缘刚好出现在地平线以上(或日落时刚好消失在地平线以下,0度)。因此,无论是普通人、海员还是天文爱好者,大家得到的日出和日落时间都是一样的。(可以查看pyephem文档中的海军天文台日出日落部分)
总结一下,一旦正确设置了pyephem.Observer
(包括经纬度、日期、时间、气压(可能还要考虑海拔)等),就可以通过
Observer.previous_rising()
和Observer.next_setting()
方法获取各种黄昏时间(黎明、黄昏)以及日出和日落时间,
其中第一个参数是ephem.Sun()
,
并且use_center=
参数需要设置为True
以进行黄昏计算,
地平线的值可以是0(如果考虑大气折射则为0:34),或者-6、-12、-18。