Как добавить объекты или смещения JulianDate в Skyfield

Объект JulianDate в Skyfield — это удобный способ быстро создать и сохранить набор значений времени в юлианских днях, и передать их методу Skyfield at() для расчета астрономических положений в различных координатах. (см. пример скрипта)

Однако я не могу найти метод add или offset, чтобы добавить смещение по времени или итерацию смещений к объекту JulianDate. Кажется, я всегда борюсь с датами и временем.

Вот очень простой, абстрактный пример. Я генерирую 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

person uhoh    schedule 12.02.2016    source источник


Ответы (1)


См. здесь,

Мое решение заключается в следующем:

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")
person hjyanghj    schedule 13.06.2016
comment
Превосходно! Вопрос был написан еще в феврале, до того, как существовал метод .timescale(). Хорошо поймал! - person uhoh; 13.06.2016