计算相邻数据点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
相关产品推荐
相关产品推荐

