如何遍历DataFrame每行实现度分秒经纬度转十进制度
度分秒格式坐标转十进制度报错解决
数据示例
latitude longitude 0 40°02.894'N 105°18.006'W 1 40°02.894'N 105°18.006'W 2 40°02.894'N 105°18.006'W 3 40°02.894'N 105°18.006'W 4 40°02.894'N 105°18.006'W ... ... ... 5947 39°56.275'N 105°15.395'W 5948 39°56.275'N 105°15.395'W 5949 39°56.275'N 105°15.395'W 5950 39°56.275'N 105°15.395'W 5951 39°56.275'N 105°15.395'W
初始尝试与报错
尝试遍历每行转换坐标,代码如下:
deg, minutes, seconds, direction = re.split('[°\'."]', dataset['latitude'].astype(str)) (float(deg) + float(minutes)/60 + float(seconds)/(3600)) * (-1 if direction in ['W', 'S'] else 1)
出现报错:
229 and the remainder of the string is returned as the final element 230 of the list.""" ---> 231 return _compile(pattern, flags).split(string, maxsplit) 232 233 def findall(pattern, string, flags=0): TypeError: expected string or bytes-like object
更新后的尝试与新报错
修改代码后尝试:
for deg, minutes, seconds, direction in map( lambda x: re.split('[°\'."]',x), dataset['latitude'].astype(str) ): var1 = (float(deg) + float(minutes)/60 + float(seconds)/(3600)) var2 = -1 if direction in ['W', 'S'] else 1 result = var1 * var2
出现新报错:
----> 148 for deg, minutes, seconds, direction in map( 149 lambda x: re.split('[°\'."]',x), dataset['latitude'] 150 ): 151 var1 = (float(deg) + float(minutes)/60 + float(seconds)/(3600)) TypeError: 'DataFrame' object is not callable
问题分析与解决方案
问题原因
- 正则拆分与数据格式不匹配:你的数据是「度°分(带小数)'方向」格式,没有秒,拆分后只会得到3个元素,但代码强行赋值给4个变量,会导致解包错误。
- 直接对Series调用re.split:
re.split只能处理单个字符串,不能直接作用于整个Series对象,因此触发TypeError。 - 变量名冲突:报错
'DataFrame' object is not callable大概率是因为你之前将map作为DataFrame变量名,覆盖了内置的map函数,导致调用时出错。
正确代码
写一个转换函数,用apply逐元素处理列数据:
import re import pandas as pd def convert_to_decimal(coordinate): # 匹配度°分.分小数'方向的格式 match = re.match(r'(\d+)°(\d+\.\d+)\'([NSEW])', coordinate) if not match: return None # 处理格式异常的坐标 deg = float(match.group(1)) minutes = float(match.group(2)) direction = match.group(3) # 标准度分转十进制度公式 decimal = deg + minutes / 60 # 根据方向调整正负:西经、南纬为负 if direction in ['W', 'S']: decimal = -decimal return decimal # 应用到DataFrame的经纬度列 dataset['latitude_decimal'] = dataset['latitude'].apply(convert_to_decimal) dataset['longitude_decimal'] = dataset['longitude'].apply(convert_to_decimal)
注意事项
如果你的期望输出是40.02894这类值(而非标准转换的40.04823),说明你可能将分的小数部分按百分制计算(而非60进制),此时只需将公式中的minutes / 60改为minutes / 100即可,但这不符合地理坐标的标准转换规则。
内容的提问来源于stack exchange,提问作者Data_Sighentist
相关产品推荐
相关产品推荐

