2010-11-02 70 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