Задать вопрос
maccree
@maccree
freelance backend developer

Подсчет планет с помощью pyswisseph, почему считает не верно?

Здравствуйте, есть код для расчета градусов планет, относительно Земли по астрологическим правилам:
Берем время на начало искомого дня и на начало следующего дня, следующий отнимаем от искомого, получаем сколько планета прошла за сутки, если значение орицательное значит её движение ретроградно и мы его помечаем буквой "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...

В чем моя ошибка?
  • Вопрос задан
  • 343 просмотра
Подписаться 2 Простой 12 комментариев
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Полагаю, полученные вами значения нельзя считать более или менее верными, нежели значения на сайте, т.к. значения на сайте получены неизвестным способом и нет возможности проверить их корректность. Фактически это «черный ящик» со всеми вытекающими.
Предлагаю просто назначить свои сведения более верными, нежели сведения с сайта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы