与Pyephem的月相的人类可读名称

时间:2014-11-02 17:21:11

标签: pyephem

似乎pyephem

" #&34;充分," "打蜡新月," "减弱隆起,"等

我是对的,不是吗?

有人知道标准的解决方案吗?

2 个答案:

答案 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'