2010-11-02 163 views
7

我已经看过使用ephem计算日出和日落的例子,并且它的工作效果很好。使用ephem计算“Solar Noon”,翻译为当地时间

当我尝试计算这两次之间的中点时,我遇到了麻烦。下面是我有:

import datetime 
import ephem 

o = ephem.Observer() 
o.lat, o.long, o.date = '37.0625', '-95.677068', datetime.datetime.utcnow() 
sun = ephem.Sun(o) 
print "sunrise:", o.previous_rising(sun), "UTC" 
print "sunset:",o.next_setting(sun), "UTC" 
print "noon:",datetime.timedelta((o.next_setting(sun)-o.previous_rising(sun))/2) 

我得到:

日出:2010年11月2日12时47分四十秒UTC
日落:2010年11月2日23时24分25秒UTC
中午:5:18:22.679044

这就是我卡住的地方。我是一名Python初学者,并且坦率地说并不是一般的程序员。

任何建议将是最受欢迎的!

回答

7

太阳正午是的平均日出和日落(参见equation of time的说明)。该ephem包有methods for getting transit times,你应该使用:

>>> import ephem 
>>> o = ephem.Observer() 
>>> o.lat, o.long = '37.0625', '-95.677068' 
>>> sun = ephem.Sun() 
>>> sunrise = o.previous_rising(sun, start=ephem.now()) 
>>> noon = o.next_transit(sun, start=sunrise) 
>>> sunset = o.next_setting(sun, start=noon) 
>>> noon 
2010/11/6 18:06:21 
>>> ephem.date((sunrise + sunset)/2) 
2010/11/6 18:06:08 

注意到,今天中午为13秒后(在你的位置),比日出和日落的平均值。

(代码ephem.date((sunrise + sunset)/2)行展示了如何轻松地操纵日期在ephem包,如果它是做正确的事。)

+0

如果你的北方(或南方)太远,太阳没有今天上升,你的日出计算不“工作”...(例如今天是7月8日但最后的日出是5月17日:-) – thebjorn 2011-07-08 10:37:07

+0

是的,我看到了问题:'ephem.AlwaysUpError:'太阳'仍然在地平线上2011/7/8 00:04:58' – 2011-07-08 10:50:16

0

两个数字的平均值是数字之和除以2,而不是将日光长度除以2。如果添加到o.previous_rising(太阳),这也可以工作,但应该是一样采取直接平均值(不应该的问题,我们是averageing datetime对象)

0

我意识到,这是很久以前的回答。但是对于那些可能使用任何代码或者不太了解Python的人来说,对于时间方程的目的有一个简单的解释。你的平均太阳运输(中午)发生在你的纵向位置。这意味着,知道你的经度,你可以找到你的平均太阳运输,只需将你的经度除以15.0,然后从12减去这个值,如果你愿意,可以用格林尼治标准时间或世界标准时间结果来给出十进制小时数。你真正的太阳能过境是从平均值中减去时间方程的结果。通常情况下,您需要计算此值才能获取维基百科公式中显示的日出和日落时间。但是感谢python软件包的信息,因为我对sunpy软件包有点麻烦。这里有一个伟大的程序,在这里bitbucket https://bitbucket.org/cmcqueen1975/sundials/wiki/Home