Здравствуйте, есть код для расчета градусов планет, относительно Земли по астрологическим правилам:
Берем время на начало искомого дня и на начало следующего дня, следующий отнимаем от искомого, получаем сколько планета прошла за сутки, если значение орицательное значит её движение ретроградно и мы его помечаем буквой "R".
Далее нам нужно сколько планета прошла за секунду, для этого делим расстояние которое планета прошла за сутки на 24 часа и 3600 сек, получаем сколько планета в тот день прошла за 1 секунду.
Полученное значение умножаем на колическво секунд нужного времени.
Например нам нужно найти время 11:35 по Москве, это utc+3 значит от 11:35 отнимаем 3 часа, получаем 8:35 переводим в секунды, 8ч= 8х3600=28800+35х60=30900 секунд
умножаем это время на значение которое планета прошла за 1 секунду в тот день.
Далее прибавляем это значение к значению на начало дня и готово. Если движение ретроградно значит отнимаем.
Написал что-то такое:
import swisseph as swe
import os
from dotenv import load_dotenv, find_dotenv
from app.services.time_convert import get_julian_datetime
# Загрузка переменных окружения из файла .env
load_dotenv(find_dotenv())
# Установка пути к эфемеридам
swe.set_ephe_path(os.getenv('EPH_PATH'))
class Planets:
def __init__(self, year: int, month: int, day: int, hour: int, minute: int, timezone: int) -> None:
"""
Конструктор класса Planets. Принимает параметры для инициализации объекта.
:params year: Год
:params month: Месяц
:params day: День
:params hour: Час
:params minute: Минута
:params timezone: Смещение временной зоны по UTC в формате HH
"""
self.year = year
self.month = month
self.day = day
self.hour = hour
self.minute = minute
self.second = 0
self.timezone = timezone
def get_planet_positions(self):
planet_names = {
swe.SUN: "Sun",
swe.MOON: "Moon",
swe.MERCURY: "Mercury",
swe.VENUS: "Venus",
swe.MARS: "Mars",
swe.JUPITER: "Jupiter",
swe.SATURN: "Saturn",
swe.URANUS: "Uranus",
swe.NEPTUNE: "Neptune",
swe.PLUTO: "Pluto",
swe.MEAN_NODE: "Mean Node",
swe.TRUE_NODE: "True Node"
}
julian_day_start = swe.julday(self.year, self.month, self.day, 0, 0)
julian_day_next = swe.julday(self.year, self.month, self.day + 1, 0, 0)
time = ((self.hour - self.timezone) * 3600) + (self.minute) * 60
planet_positions = {}
for planet_id, planet_name in planet_names.items():
planet_position_start = swe.calc_ut(julian_day_start, planet_id)[0][0]
planet_position_next = swe.calc_ut(julian_day_next, planet_id)[0][0]
planet_24_distance = planet_position_next - planet_position_start
planet_disctance_per_second = planet_24_distance / 86400
if planet_24_distance < 0:
planet_motion = " R"
end_planet_position = planet_position_start - (time * planet_disctance_per_second)
else:
planet_motion = ""
end_planet_position = planet_position_start + (time * planet_disctance_per_second)
planet_positions[planet_name] = f"{end_planet_position}{planet_motion}"
return planet_positions
Таймзона считается отдельной функцией:
# app/services/time_convert.py
from datetime import datetime, timedelta
from timezonefinder import TimezoneFinder
import math
import pytz
def get_time_zone(latitude: float, longitude: float) -> int:
"""
Получения часового пояса UTC в формате HH
:params latitude: Широта
:params longitude: Долгота
:returns: Час смещения
"""
tf = TimezoneFinder()
timezone_str = tf.timezone_at(lng=longitude, lat=latitude)
if timezone_str is None:
return None
now = datetime.now(pytz.timezone(timezone_str))
utc_offset = int(now.utcoffset().total_seconds() / 3600)
return utc_offset
При запуске скрипта для подсчета планет, выбрав дату 2002, 1, 1, 00, 00. UTC+03:00
выдает:
Sun: 293.5054715434684
Moon: 297.0847613189008
Mercury: 312.33379667722687
Venus: 293.3607665555996
Mars: 356.29460076953967
Jupiter: 98.9262063073128 R
Saturn: 68.60517297323375 R
Uranus: 323.0939618407774
Neptune: 307.9072550628026
Pluto: 256.47708428413205
Mean Node: 85.66235488484487 R
True Node: 87.05647582717305 R
Но смотря на
astro.com
получается такое:
https://www.astro.com/cgi/swetest.cgi?b=1.1.2002&n...
В чем моя ошибка?