You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:07:35