如何在Python中批量将混合DMS/DD的经纬度列转为DD格式?
统一航空事故数据集经纬度为十进制度(DD)格式的解决方案
前提假设
你使用Pandas处理数据集,以下代码基于Python环境,需提前安装pandas和numpy。
1. 读取数据集
首先导入依赖并加载数据:
import pandas as pd import numpy as np # 替换为你的数据集路径/文件名 df = pd.read_csv('aviation_data.csv')
2. 编写格式转换函数
针对混合的DD/DMS格式,先判断每行数据的格式,再做对应转换:
def dms_to_dd(dms_str): # 处理空值或非字符串输入 if pd.isna(dms_str) or not isinstance(dms_str, str): return np.nan # 提取方向标识(N/S/E/W) direction = dms_str[-1].upper() # 剥离方向和前导零,保留纯数字部分 num_segment = dms_str[:-1].lstrip('0') try: # 纬度(N/S)格式:度(2位) + 分(2位) + 秒(2位) if direction in ('N', 'S'): if len(num_segment) != 6: return np.nan degrees = int(num_segment[:2]) minutes = int(num_segment[2:4]) seconds = int(num_segment[4:6]) # 经度(E/W)格式:度(3位) + 分(2位) + 秒(2位) elif direction in ('E', 'W'): if len(num_segment) != 7: return np.nan degrees = int(num_segment[:3]) minutes = int(num_segment[3:5]) seconds = int(num_segment[5:7]) else: return np.nan # 计算十进制度值 dd_value = degrees + minutes/60 + seconds/3600 # 根据方向添加正负号(S/W为负) if direction in ('S', 'W'): dd_value *= -1 return dd_value # 捕获格式异常,返回空值 except Exception: return np.nan def normalize_coordinate(value): # 判断是否为DMS格式(含方向标识) if isinstance(value, str) and value[-1].upper() in ('N', 'S', 'E', 'W'): return dms_to_dd(value) else: # 尝试直接转换为DD格式浮点数 try: return float(value) except Exception: return np.nan
3. 批量转换整列
将函数应用到纬度和经度列,生成新的标准化列:
# 处理纬度列 df['Latitude_DD'] = df['Latitude'].apply(normalize_coordinate) # 处理经度列 df['Longitude_DD'] = df['Longitude'].apply(normalize_coordinate)
4. 验证转换结果
查看前10行数据确认转换是否正确:
print(df[['Latitude', 'Latitude_DD', 'Longitude', 'Longitude_DD']].head(10))
适配说明
- 如果你的DMS格式存在变种(比如数字与方向间有空格、分秒用小数点分隔等),可以修改
dms_to_dd函数的字符串处理逻辑。 - 转换后出现的空值对应原数据的无效格式,可根据需求删除或填充。
- 完成转换后,即可使用
folium基于Latitude_DD和Longitude_DD列绘制地图。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

