似乎pyephem
我是对的,不是吗?
有人知道标准的解决方案吗?
答案 0 :(得分:4)
在月亮完全充满的时刻之外,还没有像“满月”这样的术语的任何标准定义。这意味着,从技术上讲,当月亮完全充满时,只有一个完全无限小的时刻,因此任何你可以问PyEphem的真实时刻都将在完美的完美时刻之前或之后。
因此,除非您能够在满月时刻找到“宽”以秒为单位的标准定义,否则您询问的任何给定秒的实际阶段将会打蜡或减弱。有关所有详细信息,请参阅USNO定义:
http://aa.usno.navy.mil/faq/docs/moon_phases.php
由于那里的标准说黄道经度的差异在于你如何确定阶段,你可以尝试这样的事情:
import ephem
tau = 2.0 * ephem.pi
sun = ephem.Sun()
moon = ephem.Moon()
names = ['Waxing Crescent', 'Waxing Gibbous',
'Waning Gibbous', 'Waning Crescent']
for n in range(1, 31):
s = '2014/%d/11' % n
sun.compute(s)
moon.compute(s)
sunlon = ephem.Ecliptic(sun).lon
moonlon = ephem.Ecliptic(moon).lon
angle = (moonlon - sunlon) % tau
quarter = int(angle * 4.0 // tau)
print n, names[quarter]
答案 1 :(得分:3)
这是我对自己问题的快速而肮脏的解决方案。假设observer
与系统时区属于同一时区,但这对我的目的来说足够好。
仍然感到惊讶的是,pyephem并没有比这更精致/更精致的东西,但也许有一个令人难以理解的天文学原因。
import ephem
def human_moon(observer):
target_date_utc = observer.date
target_date_local = ephem.localtime( target_date_utc ).date()
next_full = ephem.localtime( ephem.next_full_moon(target_date_utc) ).date()
next_new = ephem.localtime( ephem.next_new_moon(target_date_utc) ).date()
next_last_quarter = ephem.localtime( ephem.next_last_quarter_moon(target_date_utc) ).date()
next_first_quarter = ephem.localtime( ephem.next_first_quarter_moon(target_date_utc) ).date()
previous_full = ephem.localtime( ephem.previous_full_moon(target_date_utc) ).date()
previous_new = ephem.localtime( ephem.previous_new_moon(target_date_utc) ).date()
previous_last_quarter = ephem.localtime( ephem.previous_last_quarter_moon(target_date_utc) ).date()
previous_first_quarter = ephem.localtime( ephem.previous_first_quarter_moon(target_date_utc) ).date()
if target_date_local in (next_full, previous_full):
return 'Full'
elif target_date_local in (next_new, previous_new):
return 'New'
elif target_date_local in (next_first_quarter, previous_first_quarter):
return 'First Quarter'
elif target_date_local in (next_last_quarter, previous_last_quarter):
return 'Last Full Quarter'
elif previous_new < next_first_quarter < next_full < next_last_quarter < next_new:
return 'Waxing Crescent'
elif previous_first_quarter < next_full < next_last_quarter < next_new < next_first_quarter:
return 'Waxing Gibbous'
elif previous_full < next_last_quarter < next_new < next_first_quarter < next_full:
return 'Waning Gibbous'
elif previous_last_quarter < next_new < next_first_quarter < next_full < next_last_quarter:
return 'Waning Crescent'