如何在Skyfield

时间:2016-02-12 14:00:52

标签: julian julian-date skyfield

Skyfield中的JulianDate对象是在Julian Days中快速生成并保存一组时间值的便捷方式,并将它们传递给Skyfield的at()方法计算各种坐标中的天文位置。 (见example script

但是,我似乎无法找到addoffset方法,因此我可以向JulianDate对象添加时间偏移量或可迭代的偏移量。我似乎总是struggle有日期和时间。

这是一个非常简单,抽象的例子。我生成jd60,它从任意jd0偏移了60天。作为一个简单的检查,我计算两次地球的位置,并确保它移动约60度。

from skyfield.api import load, JulianDate
import numpy as np

data  = load('de421.bsp')
earth = data['earth']

从任意t_zero开始:

jd0 = JulianDate(utc=(2016, 1, 17.4329, 22.8, 4, 39.3))   # (y, m, d, h, m, s)

现在,将第二个JulianDate对象偏移60天

这有效:

tim = list(jd0.tt_tuple())
tim[2] += 60   # add 60 days (~1/6 of a year)

jd60 = JulianDate(utc=tuple(tim))

但是,我想要的是:

jd60 = jd0.add(delta_utc=(0, 0, 60, 0, 0, 0)) # ficticious method

现在计算位置并找到近似角度,只是为了看它是否有效。

p0  = earth.at(jd0).position.km
p60 = earth.at(jd60).position.km

dot = (p0*p60).sum()

cos_theta = dot / np.sqrt( (p0**2).sum() * (p61**2).sum() )

print (180./np.pi) * np.arccos(cos_theta)
print "should be roughly 60 degrees"

给出

60.6215331601
should be roughly 60 degrees

1 个答案:

答案 0 :(得分:1)

参考here

我的解决方案如下:

from skyfield.api import load
import numpy as np

data  = load('de421.bsp')
earth = data['earth']

ts=load.timescale()
t=ts.utc(2016, 1, np.linspace(17.4329,77.4329,61), 22.8, 4, 39.3)

p=earth.at(t)

p0  = p.position.au[:,0]
p60 = p.position.au[:,60]

dot = (p0*p60).sum()

cos_theta = dot / np.sqrt( (p0**2).sum() * (p60**2).sum() )

print (180./np.pi) * np.arccos(cos_theta)
print "should be roughly 60 degrees"

快乐的节目。