
在天文学或类似领域中,我们经常需要追踪一个物体(例如行星)在360度循环坐标系(如黄道经度)中的位置变化。一个核心任务是识别其运动方向的“逆行”或“转向”点,即当物体从顺行变为逆行,或从逆行变为顺行时的极值点。
当行星在远离0度/360度边界的区域发生转向时,使用标准的极值检测方法,例如scipy.signal.argrelextrema,通常能有效识别。例如,当水星的经度从169.01682增加到169.05885,然后减少到169.00792时,169.05885就是一个明显的转向点。
然而,当行星的坐标跨越360度(或0度)边界时,问题就变得复杂。例如,当坐标从358度变为2度时,虽然数值上看起来是一个巨大的跳变,但实际上这只是从359度“绕过”了360度/0度边界,继续向正方向移动,并非真正的运动方向逆转。传统极值检测算法可能会错误地将这种边界穿越识别为一个极值点,从而导致误报。
核心挑战在于如何区分两种情况:
我们需要一种方法来识别局部极值,同时忽略由360度边界穿越引起的数值跳变。
为了解决上述问题,我们可以利用Pandas的数据处理能力,结合差值计算和阈值过滤,精确识别真实转向点。
首先,假设我们有一个包含日期和行星坐标的Pandas DataFrame。
import pandas as pd
import io
# 示例数据
data = """
Date,Coords
13.03.2010,350.60172
14.03.2010,352.53184
15.03.2010,354.47785
16.03.2010,356.43861
17.03.2010,358.41273
18.03.2010,0.39843
19.03.2010,2.39354
20.03.2010,4.39545
21.03.2010,6.40106
22.03.2010,8.40673
23.03.2010,10.40828
24.03.2010,12.40098
25.03.2010,14.37956
26.03.2010,16.33824
13.08.2010,166.41245
14.08.2010,167.00584
15.08.2010,167.53165
16.08.2010,167.98625
17.08.2010,168.36589
18.08.2010,168.66672
19.08.2010,168.88494
20.08.2010,169.01682
21.08.2010,169.05885
22.08.2010,169.00792
23.08.2010,168.86147
24.08.2010,168.61771
25.08.2010,168.27591
26.08.2010,167.83665
"""
df = pd.read_csv(io.StringIO(data))
df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y')
print("原始数据:")
print(df)我们通过以下步骤实现极值检测:
# 获取坐标序列 c = df['Coords'] # 步骤1 & 2: 限制相邻点之间的“跳跃”幅度。 # 如果相邻点差值的绝对值小于等于阈值(例如1度),则认为这是平滑运动的一部分。 # 边界穿越(如359 -> 1)会产生很大的diff值,会被此条件排除。 threshold = 1.0 # 根据实际数据特性调整此阈值,确保能区分正常日运动和边界跳变 m0 = c.diff().abs().le(threshold) # 步骤3: 识别局部最大值 (上坡后下坡) # c.gt(c.shift(-1)) 检查当前点是否大于后一个点 # c.gt(c.shift()) 检查当前点是否大于前一个点 m1 = c.gt(c.shift(-1)) & c.gt(c.shift()) & m0 # 步骤4: 识别局部最小值 (下坡后上坡) # c.lt(c.shift(-1)) 检查当前点是否小于后一个点 # c.lt(c.shift()) 检查当前点是否小于前一个点 m2 = c.lt(c.shift(-1)) & c.lt(c.shift()) & m0 # 步骤5: 结合所有条件,标记转向点 df['Reversal'] = m1 | m2
运行上述代码,我们可以得到以下结果:
>>> df
Date Coords Reversal
0 2010-03-13 350.60172 False
1 2010-03-14 352.53184 False
2 2010-03-15 354.47785 False
3 2010-03-16 356.43861 False
4 2010-03-17 358.41273 False
5 2010-03-18 0.39843 False # 边界穿越,被正确忽略
6 2010-03-19 2.39354 False
7 2010-03-20 4.39545 False
8 2010-03-21 6.40106 False
9 2010-03-22 8.40673 False
10 2010-03-23 10.40828 False
11 2010-03-24 12.40098 False
12 2010-03-25 14.37956 False
13 2010-03-26 16.33824 False
14 2010-08-13 166.41245 False
15 2010-08-14 167.00584 False
16 2010-08-15 167.53165 False
17 2010-08-16 167.98625 False
18 2010-08-17 168.36589 False
19 2010-08-18 168.66672 False
20 2010-08-19 168.88494 False
21 2010-08-20 169.01682 False
22 2010-08-21 169.05885 True # 真实转向点,被正确识别
23 2010-08-22 169.00792 False
24 2010-08-23 168.86147 False
25 2010-08-24 168.61771 False
26 2010-08-25 168.27591 False
27 2010-08-26 167.83665 False从输出可以看出,在第一个“crash example”中,2010年3月18日从358.41273度跳变到0.39843度,这个点被正确地标记为False,因为它并非真正的逆行,而只是跨越了360度边界。而在第二个“easy case”中,2010年8月21日169.05885度,作为运动方向的最高点,被准确地标记为True,这是一个真实的逆行开始点。
通过巧妙地结合Pandas的diff()、abs()、le()以及shift()操作,并引入一个关键的阈值来过滤掉因360度循环坐标系特性引起的数值跳变,我们能够构建一个鲁棒且高效的行星逆行(或转向)点检测机制。这种方法不仅解决了传统极值检测在循环坐标系中的局限性,而且充分利用了Pandas在数据处理方面的优势,为天文学数据分析提供了一个实用的解决方案。
以上就是使用Pandas精确识别360度循环坐标中的逆行与转向点的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号