Python 如何使用PyEphem计算经度

Python 如何使用PyEphem计算经度,python,astronomy,pyephem,Python,Astronomy,Pyephem,尝试使用PyEphem计算太阳纬度和经度,但与星历不匹配 太阳:2011年5月4日We 04 14:46:08 13TA12=43度左右(根据网站www.findyourfate.com) 有什么不对劲吗?如何计算行星/太阳的经度。日心/地心。一个有趣的问题,值得详细回答 第一个问题。PyEphem的日期格式为YYYY/mm/dd,而不是yyy-mm-dd >>> from ephem import * >>> Date('2011-05-04') 2010/

尝试使用PyEphem计算太阳纬度和经度,但与星历不匹配
太阳:2011年5月4日We 04 14:46:08 13TA12=43度左右(根据网站www.findyourfate.com)


有什么不对劲吗?如何计算行星/太阳的经度。日心/地心。

一个有趣的问题,值得详细回答

第一个问题。PyEphem的日期格式为
YYYY/mm/dd
,而不是
yyy-mm-dd

>>> from ephem import *
>>> Date('2011-05-04')
2010/6/26 00:00:00
>>> Date('2011/05/04')
2011/5/4 00:00:00
(这种行为似乎毫无帮助。从PyEphem版本3.7.5.1开始,这种行为已经得到纠正。)

第二个问题。在PyEphem中,
hlon
通常是物体的日心经度(太阳中心坐标系中的经度)。这对太阳来说毫无意义。因此,作为一个特殊的未记录的例外,当你查找太阳的
hlon
hlat
时,你会得到地球的日心经度和纬度

(如果有文档记录就好了。Pypehem 3.7.5.1现在提供了符合我建议的文档。)

我相信,你想要的是太阳的光。您可以使用Pyephem的
黄道
功能查找天体的黄道坐标:

>>> sun = Sun()
>>> sun.compute('2011/05/04')
>>> Ecliptic(sun).lon
43:02:58.9
然而,报告称“13TA12”(即金牛座的13°12′,对应于以弗所的43:12:00)。失踪的0:09发生了什么事?我认为这可以归结为历元的选择(也就是说,要考虑多少进动)。默认情况下,PyEphem使用标准天文纪元。但findyourfate.com似乎使用了日期纪元:

我希望这一切都很清楚:如果没有,一定要问


如果您想用Python生成整个表,可以按照下面的代码进行。我不知道使用PyEphem计算月球节点的简单方法,所以我还没有实现这一点。(我希望您可以通过迭代搜索来实现,但我还没有尝试过。)

从ephem导入*
导入日期时间
进口itertools
输入数学
十二生肖='AR TA GE CN LE VI LI SC SG CP AQ PI'.split()
def格式(黄道带经度):
“将经度格式化为黄道带形式(如'00AR00'),并以字符串形式返回。”
l=数学度(经度标准)
度=整数(l%30)
星座=黄道带[int(l/30)]
分钟=整数(四舍五入((l%1)*60))
返回“{0:02}{1}{2:02}”。格式(度、符号、分钟)
def格式角度作为时间(a):
“”“将角度格式化为小时:分钟:秒,并将其作为字符串返回。”“”
a=数学学位(a)/15.0
小时=整数(a)
分钟=整数((a%1)*60)
秒=整数((a*60)%1)*60)
返回“{0:02}:{1:02}:{2:02}”。格式(小时、分钟、秒)
def打印日期的星历(日期,正文):
日期=日期(日期)
打印datetime.datetime(*date.tuple()[:3]).strftime(“%A”)[:2],
打印“{0:02}”。格式(date.tuple()[2]),
格林威治=观察员()
greenwich.date=日期
打印格式为时间(greenwich.sidereal时间()),
对于b类机构:
b、 计算(日期,日期)
打印格式为黄道经度(黄道(b),
打印
def打印月(年、月、正文)的星历:
打印
打印(datetime.date(年、月、1).strftime(“%B%Y”).upper()
.中心(14+len(主体)*7))
打印
打印“日期SID.TIME”,
对于b类机构:

打印“{0:要使其正常工作,必须使用一个额外的字符。 在最后一个答案最后一行的下一行:

黄道(b)。龙必须改为黄道(b)。龙

在我的64位Windows 7计算机上运行32位的2.7版本


另外,如果表格以黄道经度的度数打印出来也很好。

只是猜测,但这可能与你输入的“2011-05-04”没有具体的时间信息有关吗?这很好,只要变化不大。但是43对274是巨大的。一定少了什么。叫我疯了吧,但我认为这是错误的应该约定是-180@John Machin-不一定。一些系统
mod 360
和西半球是180..359。谢谢。这对我来说是个完美的答案。它解决了我的问题。但是,黄道转换是只需要太阳吗?还是所有行星都需要(在我的情况下,行星也不匹配,所以我会尝试转换它们)。谢谢。是的,所有的天体都需要黄道经度。请参阅表格打印代码。你能解释一下你用它做什么吗?是的,我对所有天体都使用黄道经度,结果很好。我正试图将它用于我个人在股市的研究项目,以了解江恩方法的相关性或真实性。解释得很好顺便说一句,在上面的例子中,(黄道(sun).lon)返回0.7513583544261719。要返回43:02:58.8,我认为需要使用“print”语句
>>> sun = Sun()
>>> sun.compute('2011/05/04')
>>> Ecliptic(sun).lon
43:02:58.9
>>> sun.compute('2011/05/04', '2011/05/04')
>>> Ecliptic(sun).lon
43:12:29.0
from ephem import *
import datetime
import itertools
import math

zodiac = 'AR TA GE CN LE VI LI SC SG CP AQ PI'.split()

def format_zodiacal_longitude(longitude):
    "Format longitude in zodiacal form (like '00AR00') and return as a string."
    l = math.degrees(longitude.norm)
    degrees = int(l % 30)
    sign = zodiac[int(l / 30)]
    minutes = int(round((l % 1) * 60))
    return '{0:02}{1}{2:02}'.format(degrees, sign, minutes)

def format_angle_as_time(a):
    """Format angle as hours:minutes:seconds and return it as a string."""
    a = math.degrees(a) / 15.0
    hours = int(a)
    minutes = int((a % 1) * 60)
    seconds = int(((a * 60) % 1) * 60)
    return '{0:02}:{1:02}:{2:02}'.format(hours, minutes, seconds)

def print_ephemeris_for_date(date, bodies):
    date = Date(date)
    print datetime.datetime(*date.tuple()[:3]).strftime('%A')[:2],
    print '{0:02}'.format(date.tuple()[2]),
    greenwich = Observer()
    greenwich.date = date
    print format_angle_as_time(greenwich.sidereal_time()),
    for b in bodies:
        b.compute(date, date)
        print format_zodiacal_longitude(Ecliptic(b).long),
    print

def print_ephemeris_for_month(year, month, bodies):
    print
    print (datetime.date(year, month, 1).strftime('%B %Y').upper()
           .center(14 + len(bodies) * 7))
    print
    print 'DATE  SID.TIME',
    for b in bodies:
        print '{0: <6}'.format(b.name[:6].upper()),
    print
    for day in itertools.count(1):
        try:
            datetuple = (year, month, day)
            datetime.date(*datetuple)
            print_ephemeris_for_date(datetuple, bodies)
        except ValueError:
            break

def print_ephemeris_for_year(year):
    bodies = [Sun(), Moon(), Mercury(), Venus(), Mars(), Jupiter(), 
              Saturn(), Uranus(), Neptune(), Pluto()]
    for month in xrange(1, 13):
        print_ephemeris_for_month(year, month, bodies)
        print