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

如何遍历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

问题分析与解决方案

问题原因

  1. 正则拆分与数据格式不匹配:你的数据是「度°分(带小数)'方向」格式,没有秒,拆分后只会得到3个元素,但代码强行赋值给4个变量,会导致解包错误。
  2. 直接对Series调用re.split:re.split只能处理单个字符串,不能直接作用于整个Series对象,因此触发TypeError。
  3. 变量名冲突:报错'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:18:19