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

Python读取Excel地址查询经纬度报'NoneType'无latitude属性错误

批量查询地址经纬度报错'NoneType' object has no attribute 'latitude'解决方案

问题场景

读取存储地址信息的Excel文档,批量调用Nominatim接口查询对应经纬度时触发上述报错,手动传入单个有效地址运行代码可正常返回结果,测试代码及正常输出如下:

import pandas as pd
from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="myApp")

df2 = pd.DataFrame({'Location':
            ['188 Glezen Lane Wayland MA 01778']})

df2[['location_lat', 'location_long']] = df2['Location'].apply(
    geolocator.geocode).apply (lambda x: pd.Series(
        [x.latitude, x.longitude], index = ['location_lat', 'location_long']))

print(df2)

正常运行输出:

Location  location_lat  location_long
0  188 Glezen Lane Wayland MA 01778     42.386672     -71.345426

待读取的Excel表内容如下:
待读取地址表样例
原批量运行的报错代码:

import pandas as pd
from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent="myApp")

data = pd.read_excel (r'C:\Users\scott.correia\Desktop\SoS_Test.xlsx') 

df2 = pd.DataFrame(data, columns = ['Location'])

df2[['location_lat', 'location_long']] = df2['Location'].apply(
    geolocator.geocode).apply (lambda x: pd.Series(
        [x.latitude, x.longitude], index = ['location_lat', 'location_long']))

print(df2)

报错原因

geolocator.geocode()方法在地址匹配失败、请求超时、触发服务限流时会返回None,原代码未做非空判断,直接对返回值读取.latitude、.longitude属性,遇到None值时就会触发该报错。单地址测试可正常运行是因为测试用的地址可被正常解析,Excel中存在无法被Nominatim识别的地址条目。

修复后代码

修复点包含三个部分:增加请求超时配置、添加请求频率限制适配Nominatim免费服务规则、对解析结果做非空判断,解析失败时填充空值避免报错。

import pandas as pd
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter

# 初始化地理编码器,设置10秒超时避免请求卡死
geolocator = Nominatim(user_agent="myApp", timeout=10)
# 配置请求间隔为1秒,符合Nominatim免费接口调用规则,避免被限流
geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)

data = pd.read_excel(r'C:\Users\scott.correia\Desktop\SoS_Test.xlsx') 
df2 = pd.DataFrame(data, columns=['Location'])

def parse_geocode(address):
    location = geocode(address)
    # 地址解析失败时返回空值
    if not location:
        return pd.Series([None, None], index=['location_lat', 'location_long'])
    return pd.Series([location.latitude, location.longitude], index=['location_lat', 'location_long'])

df2[['location_lat', 'location_long']] = df2['Location'].apply(parse_geocode)

print(df2)
# 如需保存结果可取消下方注释
# df2.to_excel('地址经纬度解析结果.xlsx', index=False)

注意事项

  • 运行后若存在个别地址经纬度为空,属于正常情况,可手动核对对应地址的拼写、补全省市区/邮编等信息后重新查询
  • 不要调低请求间隔,Nominatim公开接口对免费调用有严格的频率限制,高频请求会被临时封禁IP

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:15:11