求支持Python 3.6的邮编转城市信息库(适配德国及欧洲)
刚好之前帮朋友处理过类似的德国邮编匹配需求,结合你用Python3.6的情况,给你几个实用的方案,亲测适配性拉满:
方案1:本地数据集+Pandas合并(最稳定,适合大数据量)
很多第三方库要么版本兼容坑多,要么只支持美区,直接用公开的德国邮编本地数据集反而更靠谱,还方便未来扩展其他欧洲国家。
- 操作步骤:
- 找一份靠谱的德国邮编CSV数据,一般包含
PLZ(邮编)、Ort(城市)、Bundesland(州)这些核心字段,德国联邦统计局或者一些公开数据平台都能下载到。 - 把数据集读成Pandas DataFrame,和你的主数据用邮编字段做左连接,注意一定要把邮编存成字符串类型,不然像
01067这种带前导零的邮编会被转成数字丢失信息:
import pandas as pd # 模拟你的主数据集,邮编列名叫'plz' main_df = pd.DataFrame({'plz': ['10178', '80331', '60313']}) # 读入本地德国邮编数据(根据你下载的文件调整列名和路径) de_zip_data = pd.read_csv('german_postal_codes.csv', dtype={'plz': str}) # 合并后自动新增城市、州列 final_df = main_df.merge(de_zip_data[['plz', 'ort', 'bundesland']], on='plz', how='left') - 找一份靠谱的德国邮编CSV数据,一般包含
- 优势:完全兼容Python3.6,数据自己掌控,后续加法国、意大利等其他欧洲国家的邮编数据,只要重复这个合并流程就行,没有库版本依赖问题。
方案2:Geopy+Nominatim(实时查询,适合小数据量)
如果你的数据量不大,不想折腾本地数据集,可以用geopy调用OpenStreetMap的Nominatim服务,实时解析邮编对应的地理信息,这个库有兼容Python3.6的稳定版本。
- 先安装指定版本:
pip install geopy==1.20.0 - 代码示例:
from geopy.geocoders import Nominatim import pandas as pd # 初始化编码器,指定德语环境+德国区域限制,避免返回其他国家的结果 geolocator = Nominatim(user_agent="my_zip_lookup_app", country_bias='de') def extract_geo_info(zip_code): try: # 构造查询字符串,明确指定德国 location = geolocator.geocode(f"{zip_code}, Deutschland") if location: address_components = location.raw.get('address', {}) # 优先取city,没有的话取town/village city = address_components.get('city', address_components.get('town', address_components.get('village'))) state = address_components.get('state') return pd.Series([city, state]) return pd.Series([None, None]) except Exception as e: print(f"查询邮编{zip_code}出错:{e}") return pd.Series([None, None]) # 把解析结果批量加到主DataFrame里 main_df = pd.DataFrame({'plz': ['10178', '80331', '60313']}) main_df[['city', 'state']] = main_df['plz'].apply(extract_geo_info) - 优势:不用存本地数据,未来扩展到其他欧洲国家,只要修改
country_bias参数(比如改成'fr'对应法国)就行。 - 提醒:Nominatim有请求频率限制,别疯狂刷接口,大数据量还是建议用方案1。
方案3:Pycountry标准化州信息(可选)
如果需要统一州的名称格式(比如把各种写法的巴伐利亚统一成"Bayern"),可以用pycountry库,它也有兼容Python3.6的版本:
- 安装指定版本:
pip install pycountry==19.8.18 - 代码示例:
import pycountry def standardize_german_state(state_name): if not state_name: return None try: # 精准匹配德国的州 state = pycountry.subdivisions.get(name=state_name, country_code='DE') return state.name # 也可以用state.code获取官方编码,比如'DE-BY' except: # 匹配不到就返回原名称 return state_name # 给主DataFrame新增标准化后的州列 main_df['state_standardized'] = main_df['state'].apply(standardize_german_state)
内容的提问来源于stack exchange,提问作者GileBrt
相关产品推荐
相关产品推荐

