使用PyEphem计算日出和日落时间

19 投票
3 回答
15456 浏览
提问于 2025-04-15 21:35

可以用 PyEphem 来计算黎明、黄昏和日落的时间吗?我用 PyEphem 生成了白天和黑夜的时间,但没找到关于日落、黄昏和黎明的相关内容。

3 个回答

4

你可以试着把 horizon 参数设置为 低于地平线,这样可以根据不同的黄昏和黎明的定义来调整。

32

下面这个脚本会用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上。

17

关于黎明和黄昏,可以参考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。

撰写回答