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

计算相邻数据点Haversine距离时出现TypeError问题求助

解决Haversine距离计算中的类型错误问题

错误原因

报错TypeError: '<' not supported between instances of 'str' and 'int'的核心原因是:你的lat和lon列存储的是字符串类型(从数据示例的引号可判断),而haversine函数需要接收数值类型(int/float)来进行纬度、经度的范围校验和距离计算。

解决方案

1. 将坐标列转换为数值类型

先把lat和lon列从字符串转为可计算的数值类型,同时处理可能的异常值:

from haversine import haversine
import pandas as pd

# 转换deviceTime为datetime格式
df['deviceTime'] = pd.to_datetime(df['deviceTime'])

# 关键步骤:将lat和lon转为数值类型,无法转换的值设为NaN
df['lat'] = pd.to_numeric(df['lat'], errors='coerce')
df['lon'] = pd.to_numeric(df['lon'], errors='coerce')

# 可选:处理转换后产生的NaN值(根据业务需求选择删除或填充)
df = df.dropna(subset=['lat', 'lon'])

2. 修正相邻点距离计算逻辑

原代码中groupby后直接apply(haversine)的写法存在参数传递问题,haversine需要接收两个点(每个点是(lat, lon)的元组),调整为更直观的逐行计算方式:

# 按车辆ID和日期分组,获取每组内的前序坐标
groups = df.groupby(['vehicleId', df['deviceTime'].dt.date])
df['prev_lat'] = groups['lat'].shift()
df['prev_lon'] = groups['lon'].shift()

# 计算相邻点的Haversine距离,无前置点时设为0
df['distance (km)'] = df.apply(
    lambda row: haversine((row['prev_lat'], row['prev_lon']), (row['lat'], row['lon'])) 
    if pd.notna(row['prev_lat']) else 0,
    axis=1
)

# 清理临时列
df.drop(['prev_lat', 'prev_lon'], axis=1, inplace=True)

3. 验证数据类型

执行转换后,用以下命令确认坐标列类型是否正确:

print(df[['lat', 'lon']].dtypes)

输出应为float64或int64类型。

补充说明

  • 如果数据中存在非数值的异常坐标,pd.to_numeric的errors='coerce'参数会将其转为NaN,需根据业务场景决定删除这些行或用合理值填充。
  • 分组计算时,shift()会自动将每组第一行的前置坐标设为NaN,因此apply中判断pd.notna(row['prev_lat'])即可确保只计算有效相邻点的距离。

内容的提问来源于stack exchange,提问作者james kam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:43:10