您好,登录后才能下订单哦!
# Python+xlwings如何制作天气预报表
## 引言
在现代数据分析和办公自动化领域,Python因其强大的数据处理能力和丰富的库生态系统而广受欢迎。本文将详细介绍如何利用Python的xlwings库结合天气API,创建一个功能完整的天气预报表系统。这个系统将实现从数据获取到Excel报表生成的全流程自动化,适合需要定期制作天气报告的气象工作者、数据分析师或办公人员。
## 一、环境准备与工具介绍
### 1.1 为什么选择Python+xlwings
Python在数据处理方面的优势:
- 丰富的数据处理库(pandas, numpy)
- 简洁高效的语法
- 强大的社区支持
xlwings的特点:
- 完美兼容Excel
- 支持VBA和Python交互
- 可以操作Excel的几乎所有功能
- 跨平台支持(Windows/macOS)
与其他Excel操作库的比较:
- openpyxl:更适合简单的Excel操作
- pandas.ExcelWriter:基础导出功能
- xlwings:完整的Excel控制能力
### 1.2 开发环境搭建
#### 安装必要库
```bash
pip install xlwings requests pandas
import xlwings as xw
import requests
import pandas as pd
print("所有库已正确安装")
常用的天气API服务: 1. 和风天气(免费版支持基础查询) 2. 心知天气(提供多种气象数据) 3. OpenWeatherMap(国际服务)
以和风天气为例,注册流程: 1. 访问官网注册开发者账号 2. 获取API Key 3. 阅读API文档了解调用方式
基础请求示例:
import requests
import json
def get_weather(city, api_key):
url = f"https://devapi.qweather.com/v7/weather/now?location={city}&key={api_key}"
response = requests.get(url)
data = json.loads(response.text)
return data
# 使用示例
api_key = "你的API_KEY"
weather_data = get_weather("101010100", api_key) # 北京的城市代码
print(weather_data)
典型API响应结构:
{
"code": "200",
"updateTime": "2023-05-20T10:30+08:00",
"now": {
"temp": "23",
"feelsLike": "25",
"icon": "101",
"text": "多云",
"windDir": "东南风",
"windScale": "3",
"humidity": "45"
}
}
数据解析函数:
def parse_weather_data(raw_data):
now = raw_data.get('now', {})
return {
'温度': now.get('temp'),
'体感温度': now.get('feelsLike'),
'天气状况': now.get('text'),
'风向': now.get('windDir'),
'风力等级': now.get('windScale'),
'相对湿度': now.get('humidity'),
'更新时间': raw_data.get('updateTime')
}
扩展函数获取7天预报:
def get_7day_forecast(city, api_key):
url = f"https://devapi.qweather.com/v7/weather/7d?location={city}&key={api_key}"
response = requests.get(url)
return json.loads(response.text)
使用xlwings创建新工作簿:
def create_template(output_path):
app = xw.App(visible=False) # 无界面模式
wb = app.books.add()
# 添加工作表
sheet = wb.sheets[0]
sheet.name = "天气报告"
# 设置标题
sheet.range('A1').value = "城市天气预报"
sheet.range('A1').font.bold = True
sheet.range('A1').font.size = 16
# 保存模板
wb.save(output_path)
wb.close()
app.quit()
典型天气报表包含: 1. 标题区(报表名称、日期) 2. 实时天气区(当前天气状况) 3. 预报区(未来多日预报) 4. 图表区(温度趋势图)
模板优化建议: - 使用合并单元格美化标题 - 设置合适的列宽 - 预定义样式(字体、颜色)
通过xlwings设置样式:
def apply_styles(sheet):
# 设置标题样式
title_range = sheet.range('A1:E1')
title_range.merge()
title_range.color = (91, 155, 213) # RGB颜色
title_range.font.color = (255, 255, 255)
# 设置表头样式
headers = sheet.range('A3:E3')
headers.font.bold = True
headers.api.Borders.LineStyle = 1 # 添加边框
# 设置数据区域格式
data_range = sheet.range('A4:E10')
data_range.api.Borders.LineStyle = 1
data_range.api.HorizontalAlignment = -4108 # 居中
数据填充函数:
def fill_realtime_data(sheet, weather_info):
sheet.range('A2').value = f"更新时间: {weather_info['更新时间']}"
data = [
["当前温度", f"{weather_info['温度']}°C"],
["天气状况", weather_info['天气状况']],
["体感温度", f"{weather_info['体感温度']}°C"],
["风力风向", f"{weather_info['风向']}{weather_info['风力等级']}级"],
["相对湿度", f"{weather_info['相对湿度']}%"]
]
sheet.range('A4').value = data
处理预报数据:
def fill_forecast_data(sheet, forecast_data):
# 准备表头
headers = ["日期", "白天天气", "夜间天气", "最高温", "最低温"]
sheet.range('A10').value = headers
# 准备数据行
forecast_days = forecast_data.get('daily', [])
data_rows = []
for day in forecast_days:
row = [
day['fxDate'],
day['textDay'],
day['textNight'],
f"{day['tempMax']}°C",
f"{day['tempMin']}°C"
]
data_rows.append(row)
# 写入数据
sheet.range('A11').value = data_rows
创建图表:
def add_temperature_chart(sheet, forecast_data):
# 获取图表数据范围
dates = [day['fxDate'] for day in forecast_data['daily']]
max_temps = [int(day['tempMax']) for day in forecast_data['daily']]
min_temps = [int(day['tempMin']) for day in forecast_data['daily']]
# 创建数据表
chart_data = sheet.range('G1').expand('table')
chart_data.value = [['日期', '最高温', '最低温']]
for i in range(len(dates)):
chart_data[i+1, 0].value = dates[i]
chart_data[i+1, 1].value = max_temps[i]
chart_data[i+1, 2].value = min_temps[i]
# 创建图表对象
chart = sheet.charts.add(left=sheet.range('G10').left,
top=sheet.range('G10').top)
# 设置图表数据
chart.set_source_data(chart_data)
# 配置图表类型和样式
chart.chart_type = 'line'
chart.api[1].HasTitle = True
chart.api[1].ChartTitle.Text = "未来7天温度趋势"
扩展为多城市支持:
def get_multiple_cities_weather(city_codes, api_key):
all_data = {}
for city in city_codes:
try:
data = get_weather(city, api_key)
all_data[city] = parse_weather_data(data)
except Exception as e:
print(f"获取{city}天气失败: {str(e)}")
return all_data
增强API请求的健壮性:
def robust_get_weather(city, api_key, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
return json.loads(response.text)
except (requests.Timeout, requests.ConnectionError) as e:
print(f"请求失败,尝试 {attempt + 1}/{max_retries}")
time.sleep(2 ** attempt) # 指数退避
raise Exception("天气API请求失败")
使用schedule库实现定时任务:
import schedule
import time
def daily_report_job():
print("开始生成每日天气报告...")
api_key = "your_api_key"
city = "101010100" # 北京
# 获取数据
weather_data = get_weather(city, api_key)
forecast_data = get_7day_forecast(city, api_key)
# 生成报表
output_path = f"weather_report_{time.strftime('%Y%m%d')}.xlsx"
generate_full_report(weather_data, forecast_data, output_path)
print(f"报告已生成: {output_path}")
# 设置每天上午8点执行
schedule.every().day.at("08:00").do(daily_report_job)
while True:
schedule.run_pending()
time.sleep(60)
使用PyInstaller打包:
pyinstaller --onefile --windowed weather_report.py
通过本文的介绍,我们完成了一个完整的天气预报表系统的开发。这个系统展示了Python在办公自动化中的强大能力,特别是xlwings库在Excel操作方面的灵活性。读者可以根据实际需求扩展更多功能,如添加空气质量数据、降水概率图表等,使报表更加丰富实用。
[GitHub仓库链接]
Q: 如何解决xlwings的权限问题? A: 确保以管理员身份运行脚本,或调整Excel信任中心设置
Q: API请求次数有限制怎么办? A: 考虑购买商业版API服务或使用多个API Key轮询
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。