基于Pandas的水星逆行检测:360度环形坐标边界问题求解
360度环形坐标下行星逆行点的准确检测方案
问题根源
常规极值检测(如scipy.signal.argrelextrema)基于线性数值比较,无法处理角度的环形特性:当行星顺行跨越0/360°边界时(如从358°跳到0°),数值上的“骤降”会被误判为逆行启动的极大值点,但实际是正常的顺行角度循环。
解决方案
核心是消除环形坐标的不连续性,将角度转换为连续的线性数据,或计算真实的环形角度变化量,再进行逆行检测。
方法1:展开环形角度为连续线性序列
将环形角度转换为无跳变的线性序列,顺行跨边界时自动累加360°,保证数据连续性:
import numpy as np from scipy.signal import argrelextrema # 示例角度数据(替换为你的实际数据) angles = np.array([350.60172, 352.53184, 354.47785, 356.43861, 358.41273, 0.39843, 2.39354, 4.39545, 6.40106, 8.40673, 10.40828, 12.40098, 14.37956, 16.33824]) # 展开角度为连续线性序列 expanded_angles = np.zeros_like(angles) expanded_angles[0] = angles[0] for i in range(1, len(angles)): diff = angles[i] - angles[i-1] # 顺行跨边界(差值小于-180°),累加360°修正 if diff < -180: expanded_angles[i] = expanded_angles[i-1] + diff + 360 else: expanded_angles[i] = expanded_angles[i-1] + diff # 检测逆行开始的极大值点 retro_start_indices = argrelextrema(expanded_angles, np.greater)[0] print("逆行开始的索引位置:", retro_start_indices)
方法2:基于真实环形角度变化量检测
计算相邻角度的真实变化量(考虑环形特性),通过变化量的正负切换判断逆行启动:
import numpy as np # 示例角度数据 angles = np.array([350.60172, 352.53184, 354.47785, 356.43861, 358.41273, 0.39843, 2.39354, 4.39545, 6.40106, 8.40673, 10.40828, 12.40098, 14.37956, 16.33824]) # 计算原始差值 diffs = np.diff(angles) # 转换为真实环形变化量:顺行跨边界补360°,逆行跨边界减360° true_diffs = np.where(diffs < -180, diffs + 360, np.where(diffs > 180, diffs - 360, diffs)) # 寻找变化量由正转负的临界点(逆行启动点) # 前一个变化量为正(顺行),当前为负(逆行) retro_start_indices = np.where((true_diffs[:-1] > 0) & (true_diffs[1:] < 0))[0] + 1 print("逆行开始的索引位置:", retro_start_indices)
效果验证
- 对于正常逆行案例(如8月的水星数据),两种方法都能准确找到极大值/由正转负的临界点,即逆行启动点。
- 对于跨边界的顺行案例(如3月的水星数据),处理后的数据不会出现误判的极值点,避免了边界干扰。
内容的提问来源于stack exchange,提问作者Igor K.
相关产品推荐
相关产品推荐

