基于 Open-Meteo API 的历史天气查询工具:设计与实现指南

张开发
2026/4/16 15:32:02 15 分钟阅读

分享文章

基于 Open-Meteo API 的历史天气查询工具:设计与实现指南
文章目录基于 Open-Meteo API 的历史天气查询工具设计与实现指南1. 需求分析与设计思路2. 核心功能实现2.1 地理编码城市名转经纬度2.2 历史天气数据获取2.3 数据清洗与结构化输出3. 工具使用方法3.1 环境准备3.2 基本用法3.3 进阶选项4. 总结参考资料基于 Open-Meteo API 的历史天气查询工具设计与实现指南在数据分析、气象研究以及日常业务中获取特定城市在过去某段时间内的历史天气数据是一项常见需求。本文将详细介绍如何基于 Python 和免费开源的 Open-Meteo API设计并开发一个支持中英文城市名输入、自动解析经纬度并导出结构化天气数据的命令行工具。1. 需求分析与设计思路构建一个实用的天气查询工具需要解决以下几个核心问题地理位置解析用户通常只知道城市名称如“拉各斯”或“Lagos”而气象 API 通常需要精确的经纬度坐标。数据获取需要一个稳定、免费且覆盖全球的历史气象数据源。数据处理与展示API 返回的原始 JSON 数据需要转换为易于阅读和分析的结构化格式如 CSV 或 Excel并提供直观的统计摘要。基于上述需求我们选择了Open-Meteo作为数据源。Open-Meteo 提供了无需 API Key 即可使用的免费接口包括用于地理编码的 Geocoding API 和用于获取气象数据的 Historical Weather API [1]。工具的整体架构分为四个步骤参数解析接收用户输入的城市名、国家名、时间段等参数。地理编码Geocoding将城市名转换为经纬度坐标。天气查询调用历史天气 API 获取指定时间段的每日数据。数据处理与输出使用 Pandas 处理数据生成统计摘要并导出为 CSV 和 Excel 文件。2. 核心功能实现2.1 地理编码城市名转经纬度Open-Meteo 的 Geocoding API 支持通过名称搜索城市。为了提高准确性我们设计了geocode_city函数。该函数首先使用城市名进行搜索如果用户提供了国家名称则在返回的结果中进行过滤匹配。defgeocode_city(city:str,country:str)-dict:urlhttps://geocoding-api.open-meteo.com/v1/searchparams{name:city,count:10,language:en,format:json,}# 发送请求并解析 JSON# ...# 若提供了国家名尝试按国家过滤matchedresultsifcountry:country_lowercountry.lower()filtered[rforrinresultsifcountry_lowerinr.get(country,).lower()orcountry_lowerinr.get(country_code,).lower()]iffiltered:matchedfiltered# 取人口最多或第一个结果matched_sortedsorted(matched,keylambdar:r.get(population,0),reverseTrue)rmatched_sorted[0]return{name:r.get(name,city),latitude:r[latitude],longitude:r[longitude],country:r.get(country,),timezone:r.get(timezone,auto),}这种设计的优势在于它能够有效处理同名城市的问题例如法国和葡萄牙都有名为 Lagos 的城市通过国家过滤和人口排序确保定位到用户真正想要的城市。2.2 历史天气数据获取获取到经纬度后我们调用 Historical Weather API。该接口支持丰富的气象指标。在我们的脚本中我们选取了最高/最低气温、降水量、风速、相对湿度、日照时长等 18 个常用指标。deffetch_historical_weather(latitude,longitude,start_date,end_date,timezoneauto):urlhttps://archive-api.open-meteo.com/v1/archiveparams{latitude:latitude,longitude:longitude,start_date:start_date,end_date:end_date,daily:,.join(DAILY_VARIABLES),timezone:timezone,temperature_unit:celsius,wind_speed_unit:kmh,precipitation_unit:mm,}resprequests.get(url,paramsparams,timeout30)resp.raise_for_status()returnresp.json()2.3 数据清洗与结构化输出API 返回的数据是 JSON 格式其中daily字段包含了按时间序列排列的各个指标数组。我们使用pandas.DataFrame将其转换为表格形式并进行了以下优化字段重命名将英文变量名转换为易懂的中文列名。天气代码映射Open-Meteo 返回的weather_code是 WMO世界气象组织标准代码。我们在脚本中内置了映射字典将其转换为直观的中文描述如“晴天”、“小雨”。单位转换将日照时长从秒转换为小时便于阅读。在输出阶段脚本不仅生成包含每日详细数据的 CSV 文件还生成一个包含“每日天气”和“统计摘要”两个工作表的 Excel 文件。统计摘要涵盖了平均气温、累计降水量、降水天数等关键指标极大地方便了用户的快速分析。3. 工具使用方法该工具被封装为一个标准的命令行程序使用argparse解析参数。3.1 环境准备确保已安装 Python 3并安装必要的依赖库pipinstallrequests pandas openpyxl3.2 基本用法最基础的用法是指定城市名称和时间段。例如查询尼日利亚拉各斯 2026 年 1 月 1 日至 4 月 1 日的天气python3 weather_query.py--cityLagos--countryNigeria--start2026-01-01--end2026-04-01运行输出示例[Geocoding] 正在查询城市Lagos, Nigeria ... [Geocoding] 已定位Lagos, Lagos, Nigeria (lat6.45407, lon3.39467) [API] 正在获取 2026-01-01 至 2026-04-01 的历史天气数据 ... 天气查询结果Lagos, Nigeria (2026-01-01 ~ 2026-04-01) 【统计摘要】共 91 天数据 最高气温(°C) 最低气温(°C) 平均气温(°C) 总降水量(mm) 最大风速(km/h) 最高相对湿度(%) 最低相对湿度(%) 平均值 30.8 26.5 28.4 1.1 16.2 89.4 65.3 最大值 32.7 28.1 29.7 27.3 22.8 97.0 79.0 最小值 28.5 24.0 26.0 0.0 11.5 80.0 41.0 【降水统计】 累计降水量102.1 mm 降水天数66 天占比 72.5% 【天气类型分布前5】 轻毛毛雨41 天 阴天19 天 中毛毛雨14 天 重毛毛雨10 天 小雨6 天 [输出] CSV 文件已保存./Lagos_2026-01-01_2026-04-01.csv [输出] Excel 文件已保存./Lagos_2026-01-01_2026-04-01.xlsx3.3 进阶选项支持中文城市名工具能够处理中文输入。python3 weather_query.py--city北京--start2025-01-01--end2025-12-31指定输出目录使用--output参数将生成的文件保存到指定文件夹。python3 weather_query.py--cityTokyo--start2025-06-01--end2025-08-31--output./results仅打印摘要如果不需要保存文件可以使用--no-save参数脚本将在终端打印统计摘要和前 10 行数据预览。python3 weather_query.py--cityParis--start2025-01-01--end2025-03-31 --no-save4. 总结本文介绍的历史天气查询工具通过整合 Open-Meteo 的 Geocoding 和 Historical Weather API实现了一个从自然语言输入到结构化数据输出的完整工作流。借助 Pandas 强大的数据处理能力该工具不仅能提供详尽的每日气象指标还能自动生成统计摘要是气象数据收集和初步分析的得力助手。参考资料[1] Open-Meteo. Historical Weather API Documentation. https://open-meteo.com/en/docs/historical-weather-api

更多文章