背景介绍
在日常生活中,我们常常需要分析本地历史天气数据(如从气象网站导出的CSV文件),以了解气候趋势、极值日期等信息。例如:
– 分析月度温度/湿度变化,辅助规划户外活动(如“夏季湿度高时减少户外时长”);
– 查找极端天气日期(如“温度最低的一天是否需要提前准备保暖”)。
为此,我们开发了“本地历史天气数据分析工具”,它能读取CSV格式的天气数据,自动统计月度均值、查找极值,并通过可视化展示趋势。
思路分析
工具的核心流程分为四步:
- 数据读取:用
pandas.read_csv()读取CSV文件; - 数据预处理:将日期列转为
datetime格式,提取月份(数字+中文); - 统计分析:
- 按月份分组,计算平均温度、湿度、风速;
- 用
max()/min()+idxmax()/idxmin()定位极值日期;
- 可视化:用
matplotlib绘制双Y轴折线图,展示温度、湿度的月度趋势。
代码实现
1. 环境准备
仅需安装 pandas 和 matplotlib:
pip install pandas matplotlib
2. 完整代码(含测试数据生成)
import pandas as pd
import matplotlib.pyplot as plt
def analyze_weather_data(csv_path):
# ========== 1. 读取并预处理数据 ==========
df = pd.read_csv(csv_path)
# 转换日期格式
df['日期'] = pd.to_datetime(df['日期'])
# 提取数字月份(用于分组排序)和中文月份(用于展示)
df['month_num'] = df['日期'].dt.month
month_map = {1: '1月', 2: '2月', 3: '3月', 4: '4月', 5: '5月', 6: '6月',
7: '7月', 8: '8月', 9: '9月', 10: '10月', 11: '11月', 12: '12月'}
df['月份'] = df['month_num'].map(month_map)
# ========== 2. 月度统计分析 ==========
# 按月份分组,计算均值
monthly_stats = df.groupby('month_num').agg({
'温度': 'mean',
'湿度': 'mean',
'风速': 'mean'
}).reset_index()
# 映射为中文月份,调整列顺序
monthly_stats['月份'] = monthly_stats['month_num'].map(month_map)
monthly_stats = monthly_stats[['月份', '温度', '湿度', '风速']]
print("===== 月度统计结果 =====")
print(monthly_stats)
# ========== 3. 极值查找 ==========
# 温度极值
max_temp = df[df['温度'] == df['温度'].max()]
min_temp = df[df['温度'] == df['温度'].min()]
# 湿度极值
max_humidity = df[df['湿度'] == df['湿度'].max()]
min_humidity = df[df['湿度'] == df['湿度'].min()]
print("\n===== 极值信息 =====")
print(f"温度最高:{max_temp['日期'].values[0]},{max_temp['温度'].values[0]}℃")
print(f"温度最低:{min_temp['日期'].values[0]},{min_temp['温度'].values[0]}℃")
print(f"湿度最高:{max_humidity['日期'].values[0]},{max_humidity['湿度'].values[0]}%")
print(f"湿度最低:{min_humidity['日期'].values[0]},{min_humidity['湿度'].values[0]}%")
# ========== 4. 可视化展示 ==========
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax1 = plt.subplots(figsize=(10, 6))
# 温度折线(左Y轴)
ax1.plot(monthly_stats['月份'], monthly_stats['温度'],
color='red', label='平均温度(℃)')
ax1.set_xlabel('月份')
ax1.set_ylabel('平均温度(℃)', color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax1.set_xticklabels(monthly_stats['月份'], rotation=45) # 旋转X轴标签
# 湿度折线(右Y轴)
ax2 = ax1.twinx()
ax2.plot(monthly_stats['月份'], monthly_stats['湿度'],
color='blue', label='平均湿度(%)')
ax2.set_ylabel('平均湿度(%)', color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# 合并图例
handles1, labels1 = ax1.get_legend_handles_labels()
handles2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(handles1 + handles2, labels1 + labels2, loc='upper left')
plt.title('月度温度、湿度变化趋势')
plt.tight_layout() # 避免标签截断
plt.show()
# 生成测试数据(首次运行时取消注释)
def generate_test_data():
test_data = {
'日期': ['2023-01-01', '2023-01-02', '2023-02-01', '2023-02-02',
'2023-08-05', '2023-01-10', '2023-06-20', '2023-12-01'],
'温度': [5, 6, 8, 9, 35, -5, 28, 0],
'湿度': [60, 58, 65, 63, 60, 40, 95, 30],
'风速': [2, 1.8, 2.2, 2.5, 3, 5, 1, 4]
}
df = pd.DataFrame(test_data)
df.to_csv('weather_data.csv', index=False)
print("测试数据已生成到 weather_data.csv")
if __name__ == "__main__":
# 生成测试数据(首次运行时取消注释)
# generate_test_data()
# 分析数据(替换为自己的CSV路径)
analyze_weather_data('weather_data.csv')
代码解释
- 数据预处理:
- 用
pd.to_datetime()转换日期格式,方便后续提取月份; - 用
dt.month提取数字月份(保证分组顺序),再映射为中文月份(如“1月”)。
- 用
- 统计分析:
groupby('month_num')按月份分组,agg()计算均值;- 用
max()/min()找极值,idxmax()/idxmin()定位日期(代码中直接通过布尔索引实现)。
- 可视化:
- 用
twinx()创建双Y轴,分别绘制温度(左轴,红色)和湿度(右轴,蓝色)的折线图; - 通过
get_legend_handles_labels()合并双轴图例,保证图表清晰。
- 用
总结
这个工具帮助我们完成了从“原始CSV”到“可视化趋势图+统计表格”的全流程分析,核心技术点包括:
– 数据处理:日期转换、分组统计、极值查找;
– 可视化:双Y轴折线图、中文显示、图例合并。
你可以进一步扩展功能,例如:
– 增加风速可视化(如子图或柱状图);
– 支持多文件合并分析(按年份对比);
– 导出统计结果到Excel(用 to_excel())。
通过这个项目,你不仅能分析天气数据,更能巩固Python数据处理+可视化的实战能力!