如何基于行星黄经数据计算行星相位?
行星相位计算的数学实现方法
一、数据预处理
先把原始黄经数据转换成字典格式(方便通过行星名快速获取角度),同时去掉度数符号,将角度值转为浮点数:
planets = { "Sun": 135.45, "Mars": 29.72, "Jupiter": 56.89, "Uranus": 45.27, "Pluto": 165.78, "Venus": 89.34, "Mercury": 312.22, "Saturn": 267.86, "Moon": 92.78, "Earth": 33.23 }
二、核心角度差计算逻辑
由于黄道是360°的圆周,两个行星的实际有效夹角是最小弧度数(比如黄经差350°,实际等效于10°夹角)。计算步骤:
- 先算出两个行星黄经的绝对差值:
delta = abs(angle_a - angle_b) - 取差值和
360 - delta中的较小值,得到最小夹角:min_delta = min(delta, 360 - delta)
三、定义相位规则(含容许度)
占星中相位不是严格等于目标角度,会有容许度(比如±2°)。可以预先定义各相位对应的目标角度和容许度:
aspect_rules = { "合相": (0, 2), # 目标0°,容许±2° "六分相": (60, 2), # 目标60°,容许±2° "四分相": (90, 2), # 目标90°,容许±2° "三分相": (120, 2), # 目标120°,容许±2° "对分相": (180, 2), # 目标180°,容许±2° "半六分相": (30, 1.5), # 目标30°,容许±1.5° "八分相": (45, 1.5) # 目标45°,容许±1.5° }
注:容许度可根据占星流派调整,比如某些流派四分相容许度会设为±3°
四、遍历行星对并判断相位
为避免重复计算(比如Sun-Mars和Mars-Sun算同一对),采用索引遍历的方式,只处理每对行星一次:
planet_list = list(planets.items()) # 遍历所有不重复的行星对 for i in range(len(planet_list)): name_a, angle_a = planet_list[i] for j in range(i + 1, len(planet_list)): name_b, angle_b = planet_list[j] # 计算最小夹角 delta = abs(angle_a - angle_b) min_delta = min(delta, 360 - delta) # 检查是否符合任一相位 for aspect_name, (target, tolerance) in aspect_rules.items(): if abs(min_delta - target) <= tolerance: print(f"{name_a} 与 {name_b} 形成 {aspect_name}(实际夹角:{min_delta:.2f}°)")
关键注意事项
- 逆行不影响相位:相位只看行星的黄经位置,和行星是否逆行无关,无需额外处理逆行数据
- 精度问题:保留黄经的小数位精度,避免因四舍五入导致相位判断错误
- 容许度灵活调整:不同相位的容许度可单独设置,比如小相位(半六分相、八分相)的容许度通常更小
内容的提问来源于stack exchange,提问作者Bruce Ecurb
相关产品推荐
相关产品推荐

