# 本地历史天气数据分析工具:从CSV到可视化的实践


背景介绍

在日常生活中,我们常常需要分析本地历史天气数据(如从气象网站导出的CSV文件),以了解气候趋势、极值日期等信息。例如:
– 分析月度温度/湿度变化,辅助规划户外活动(如“夏季湿度高时减少户外时长”);
– 查找极端天气日期(如“温度最低的一天是否需要提前准备保暖”)。

为此,我们开发了“本地历史天气数据分析工具”,它能读取CSV格式的天气数据,自动统计月度均值、查找极值,并通过可视化展示趋势。

思路分析

工具的核心流程分为四步:

  1. 数据读取:用 pandas.read_csv() 读取CSV文件;
  2. 数据预处理:将日期列转为datetime格式,提取月份(数字+中文);
  3. 统计分析
    • 按月份分组,计算平均温度、湿度、风速;
    • max()/min()+idxmax()/idxmin()定位极值日期;
  4. 可视化:用matplotlib绘制双Y轴折线图,展示温度、湿度的月度趋势。

代码实现

1. 环境准备

仅需安装 pandasmatplotlib

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')

代码解释

  1. 数据预处理
    • pd.to_datetime() 转换日期格式,方便后续提取月份;
    • dt.month 提取数字月份(保证分组顺序),再映射为中文月份(如“1月”)。
  2. 统计分析
    • groupby('month_num') 按月份分组,agg() 计算均值;
    • max()/min() 找极值,idxmax()/idxmin() 定位日期(代码中直接通过布尔索引实现)。
  3. 可视化
    • twinx() 创建双Y轴,分别绘制温度(左轴,红色)和湿度(右轴,蓝色)的折线图;
    • 通过 get_legend_handles_labels() 合并双轴图例,保证图表清晰。

总结

这个工具帮助我们完成了从“原始CSV”到“可视化趋势图+统计表格”的全流程分析,核心技术点包括:
数据处理:日期转换、分组统计、极值查找;
可视化:双Y轴折线图、中文显示、图例合并。

你可以进一步扩展功能,例如:
– 增加风速可视化(如子图或柱状图);
– 支持多文件合并分析(按年份对比);
– 导出统计结果到Excel(用 to_excel())。

通过这个项目,你不仅能分析天气数据,更能巩固Python数据处理+可视化的实战能力!


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注