如何找出GPS海拔数据开始单调递增的时间戳?
定位GPS海拔开始持续上升的时间戳:错误分析与解决
问题背景
我有一个包含Altitude列的DataFrame,初始阶段受GPS信号波动影响,海拔基本保持稳定;当携带GPS设备登山移动时,海拔会持续上升。需要找到海拔开始持续向上变化的时间戳,但简单的“大于”比较不可行,因为初始阶段存在信号波动。
示例数据如下:
import pandas as pd import numpy as np df_GPS = pd.DataFrame([['2024-06-21 06:22:38', 605.968389], ['2024-06-21 06:22:39', 606.009398], ['2024-06-21 06:22:40', 605.630573], ['2024-06-21 06:22:41', 605.476367 ], ['2024-06-21 06:22:42', 605.322161], ['2024-06-21 06:22:43', 605.268389], ['2024-06-21 06:22:44', 605.559398], ['2024-06-21 06:22:45', 606.630573], ['2024-06-21 06:22:46', 607.476367 ], ['2024-06-21 06:22:47', 609.322161], ], columns=['time', 'Altitude'])
理想结果为时间戳2024-06-21 06:22:43,从此处开始海拔单调上升。但我的代码存在问题:
start_move = df_GPS.loc[df_GPS['Altitude'] == df_GPS["Altitude"].is_monotonic_increasing, 'time'] print(start_move)
错误分析
你的代码核心错误在于对is_monotonic_increasing的理解偏差:
df_GPS["Altitude"].is_monotonic_increasing返回的是单一布尔值,仅表示整个Altitude列是否整体单调递增(示例数据中该值为False,因为前几行存在波动)- 你用
df_GPS['Altitude'] == 这个布尔值,本质是把海拔数值和True/False(对应数值1/0)做比较,完全不符合逐行判断递增趋势的逻辑,因此得到的结果毫无意义。
正确解法
要找到持续递增的起始点,我们需要逐行判断相邻海拔的变化,定位最后一次非递增的位置,其对应的时间就是持续上升的起始点:
import pandas as pd df_GPS = pd.DataFrame([['2024-06-21 06:22:38', 605.968389], ['2024-06-21 06:22:39', 606.009398], ['2024-06-21 06:22:40', 605.630573], ['2024-06-21 06:22:41', 605.476367 ], ['2024-06-21 06:22:42', 605.322161], ['2024-06-21 06:22:43', 605.268389], ['2024-06-21 06:22:44', 605.559398], ['2024-06-21 06:22:45', 606.630573], ['2024-06-21 06:22:46', 607.476367 ], ['2024-06-21 06:22:47', 609.322161], ], columns=['time', 'Altitude']) # 计算相邻行的海拔差值,标记是否递增(后一行 >= 前一行) df_GPS['is_increasing'] = df_GPS['Altitude'].diff() >= 0 # 找到最后一次出现非递增的索引 last_non_increase_idx = df_GPS[df_GPS['is_increasing'] == False].index[-1] # 获取对应的时间戳 start_move_time = df_GPS.loc[last_non_increase_idx, 'time'] print(start_move_time) # 输出:2024-06-21 06:22:43
说明
diff()方法计算当前行与前一行的海拔差值,>=0用于标记当前行是否比前一行高(或相等)- 找到最后一个非递增的位置,对应的时间就是持续上升的起始点(因为之后所有行都保持递增)
- 如果需要严格递增(后一行必须高于前一行),只需将
>=0改为>0即可
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

