使用Python ephem模块计算波士顿日出日落时间结果异常求助
问题分析与解决
代码核心错误
你的代码里最关键的问题是把本地时间直接赋值给了Boston.date。ephem模块要求Observer.date必须传入UTC时间,但datetime.datetime.now()返回的是你当前的本地时间,这会让ephem基于错误的时间基准计算日出日落,导致结果完全偏离实际。
修正后的代码
把观测时间改成UTC时间即可,推荐用ephem自带的ephem.now()(直接返回适配的UTC时间对象),或者datetime.datetime.utcnow():
import ephem import datetime Boston = ephem.Observer() Boston.lat = '42.3462' Boston.lon = '-71.0978' # 使用UTC时间初始化观测点的时间基准 Boston.date = ephem.now() Boston.elevation = 3 # meters Boston.pressure = 1010 # millibar Boston.temp = 25 # deg. Celcius # 设置民用日出日落对应的地平线参数(替代默认的0度) Boston.horizon = '-0:34' # 等价于-0.833度 sun = ephem.Sun() print("Next sunrise in Boston will be: ", ephem.localtime(Boston.next_rising(sun))) print("Next sunset in Boston will be: ", ephem.localtime(Boston.next_setting(sun)))
计算日出日落需额外考虑的因素
- 地平线参数:默认的
horizon=0是天文日出日落(太阳中心刚好触及地平线),日常说的民用日出日落是太阳上边缘露出地平线,需要设置horizon=-0.833(或'-0:34'),这个值是太阳视直径(约0.53度)加大气折射修正值(约0.3度)的总和。 - 大气折射:你设置的
pressure和temp参数会影响ephem对大气折射的计算,越贴近当地实际的气压、温度,结果越精准;如果设pressure=0,ephem会关闭大气折射计算,得到纯天文位置的时间。 - 时区转换:ephem内部所有计算都基于UTC,所以最后用
ephem.localtime()转换成本地时间是正确的,但前提是观测点的date必须用UTC初始化。 - 海拔高度:你设置的
elevation是对的,海拔会改变观测者的实际地平线高度,ephem会自动结合这个参数调整计算结果。
内容的提问来源于stack exchange,提问作者Ali Hassaine
相关产品推荐
相关产品推荐

