背景介绍
在个人生活(如规划旅行、晾晒衣物)或小型研究中,分析本地天气数据能帮我们发现气候规律(如季节温度变化、降水分布)。本文将使用Python(结合pandas、matplotlib)开发一个工具,实现CSV天气数据的读取、统计分析与可视化,让你快速掌握“数据处理→分析→可视化”的全流程,适合Python入门者巩固技能。
核心技术与学习价值
- 文件读写:使用
pandas读取CSV文件,处理结构化数据; - 数据分析:通过
pandas的分组(groupby)、聚合(mean)操作,实现月度统计; - 数据可视化:用
matplotlib绘制折线图(温度趋势)、柱状图(降水分布),并导出为图片; - 时间处理:解析日期字符串,按月份维度聚合数据,掌握时间序列分析基础。
思路分析
我们将问题拆解为4个步骤:
1. 数据读取:用pandas的read_csv加载CSV文件;
2. 数据预处理:解析日期字段(转为datetime类型),处理缺失值(可选);
3. 统计分析:按“月份”分组,计算平均最高温度、平均湿度;
4. 可视化与输出:绘制温度趋势折线图、降水分布柱状图(保存为图片),并打印统计结果到控制台。
代码实现(完整可运行示例)
下面是完整的Python代码,包含详细注释:
import pandas as pd
import matplotlib.pyplot as plt
# ------------------- 1. 配置环境:解决matplotlib中文显示问题 -------------------
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"] # 中文支持
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示异常
# ------------------- 2. 读取并预处理CSV数据 -------------------
# 读取CSV文件(请替换为你的文件路径,示例文件格式见问题描述)
df = pd.read_csv("weather_data.csv")
# 解析日期列:将字符串转为datetime类型,并设置为索引
df["日期"] = pd.to_datetime(df["日期"]) # 转换日期格式(自动识别常见格式)
df.set_index("日期", inplace=True) # 日期作为索引,方便时间分组
# (可选)处理缺失值:若数据有NaN,可填充或删除
# df = df.dropna() # 删除含缺失值的行
# df = df.fillna(0) # 用0填充缺失值
# ------------------- 3. 月度统计分析:计算平均最高温度、平均湿度 -------------------
# 按“自然月”分组(每月最后一天作为分组标签)
monthly_stats = df.groupby(pd.Grouper(freq='M')).mean()
# ------------------- 4. 可视化:温度趋势折线图 -------------------
plt.figure(figsize=(12, 6)) # 设置画布大小
plt.plot(
df.index, # X轴:日期
df["最高温度"], # Y轴:每日最高温度
marker="o", # 数据点标记(圆点)
color="skyblue", # 折线颜色
linestyle="-", # 折线样式
label="最高温度" # 图例标签
)
plt.title("每日最高温度变化趋势") # 图表标题
plt.xlabel("日期") # X轴标签
plt.ylabel("最高温度 (℃)") # Y轴标签
plt.grid(True, linestyle="--", alpha=0.7) # 添加网格(虚线,透明度0.7)
plt.legend() # 显示图例
plt.tight_layout() # 自动调整布局,避免标签重叠
plt.savefig("temperature_trend.png", dpi=300) # 保存为高清图片
plt.close() # 关闭当前图表,避免影响后续绘图
# ------------------- 5. 可视化:降水量分布柱状图 -------------------
plt.figure(figsize=(12, 6))
plt.bar(
df.index, # X轴:日期
df["降水量"], # Y轴:每日降水量
color="lightgreen", # 柱子颜色
width=0.6, # 柱子宽度
label="降水量" # 图例标签
)
plt.title("每日降水量分布")
plt.xlabel("日期")
plt.ylabel("降水量 (mm)")
plt.grid(axis="y", linestyle="--", alpha=0.7) # 仅Y轴显示网格
plt.legend()
plt.tight_layout()
plt.savefig("precipitation_bar.png", dpi=300)
plt.close()
# ------------------- 6. 输出月度统计信息到控制台 -------------------
for month, data in monthly_stats.iterrows():
year = month.year
month_num = month.month
avg_max_temp = data["最高温度"]
avg_humidity = data["湿度"]
# 格式化输出:温度保留1位小数,湿度取整
print(f"{year}年{month_num}月 - 平均最高温度:{avg_max_temp:.1f}℃,平均湿度:{avg_humidity:.0f}%")
核心技术与学习价值
- 文件读写:使用
pandas读取CSV文件,处理结构化数据; - 数据分析:通过
groupby+mean实现月度统计,掌握时间序列聚合; - 数据可视化:用
matplotlib绘制折线图(温度趋势)、柱状图(降水分布),并导出为图片; - 时间处理:解析日期字符串,按月份维度聚合数据,掌握时间序列分析基础。
代码说明与扩展
关键步骤解析
- 日期处理:
pd.to_datetime自动解析常见日期格式(如2023-01-01),若格式特殊,可通过format参数指定(如format="%Y/%m/%d")。 - 月度分组:
pd.Grouper(freq='M')按“自然月”聚合数据(每月最后一天作为分组标签)。若需按“日历月”(如1月所有天),也可使用df.index.dt.to_period('M')分组。 - 可视化优化:通过
figsize调整画布大小,grid添加辅助线,tight_layout避免标签重叠,dpi=300保证图片清晰度。
扩展方向
- 极端天气检测:筛选最高温度>35℃或降水量>50mm的天数;
- 多格式支持:用
openpyxl读取Excel,或json模块读取JSON数据; - 多区域对比:读取多个CSV文件,合并后按区域分组分析。
总结
通过本文的工具,我们实现了“CSV读取→数据处理→统计分析→可视化输出”的完整流程,掌握了pandas时间序列分组、matplotlib可视化的核心技能。这个工具可直接用于个人天气数据的分析,也可作为基础扩展更多功能(如季节趋势对比、多维度统计)。
若你在实践中遇到问题(如日期解析失败、图表样式调整),欢迎在评论区交流!
运行提示:将代码中的weather_data.csv替换为实际文件路径,示例数据需包含“日期、最高温度、最低温度、湿度、降水量”列(格式见问题描述)。