气象数据分析全流程:数据清洗、可视化与机器学习预测实践

发布时间:2026/10/21 8:17:06

气象数据分析全流程:数据清洗、可视化与机器学习预测实践 简介气象分析数据分析压缩包是一份面向数据分析课程实验与初学者的完整素材以中国天气网某城市天气数据为对象通过爬虫代码抓取数据生成雷达图、条形图并进行说明覆盖数据采集、清洗、可视化、实验报告撰写等环节。包体共39个文件以20张png图表、15个xml文本文件和4个rels关系文件为主整体仅1.69MB轻量易用。目前已有1853人学习下载适合用于课程作业、个人练手或报告参考。压缩包内含全部源文件、可直接用Jupyter Notebook运行的源代码以及整理完毕的实验报告png图表便于直观看图对比分析结果xml/rels文件则保留了报告与图片的完整关联结构方便学习文档生成细节。1. 气象分析项目包它到底能帮你完成哪些数据分析任务拿到一份几十万行的气象观测记录温度、湿度、气压、风速、降水量铺满整张表Excel 拉透视表只能做点汇总想看趋势、算相关性、预测明天气温就卡住了。这套气象分析数据分析资源解决的就是这个场景它把一份真实气象站的逐日观测数据从清洗、探索、建模到报告产出拆成了一整套可复现的分析流程。适合刚学完 Pandas 和 Matplotlib 想做实战练习的初学者也适合需要交付一份数据分析实验报告、又不想从零搭流程的人。按 Notebook 顺序跑下来你就把数据分析的主流环节完整串了一遍。2. 先把数据整干净字段识别、缺失值处理与时间索引2.1 读取数据与字段识别这类气象数据最常见的载体是 CSV 文件字段一般包含日期、温度、湿度、气压、风速、降水量和天气现象几类。拿到文件第一步不是急着画图而是确认每一列的 dtype 和缺失情况。日期列如果没转成 datetime 类型后面所有时间重采样和滞后特征全都会翻车。import pandas as pd # 读取时用 utf-8-sig 编码Windows 下导出的 CSV 常见编码是 GBK df pd.read_csv(weather_data.csv, encodingutf-8-sig) print(df.shape) print(df.dtypes) # 日期列转 datetime并设为索引 df[date] pd.to_datetime(df[date]) df df.set_index(date).sort_index() print(df.head()) print(df.isna().sum())读取后的第一步永远先看两个东西数据量和缺失量。df.shape给出行数列数df.isna().sum()按列统计缺了几条。日期列转 datetime 这一步最容易被忽略——不转的话resample和shift都做不了。设置索引后再sort_index是为了保证后续按时间顺序操作时数据排列正确气象站的原始记录往往不是严格按日期排好的缺测补录会造成乱序。2.2 缺失值前向填充还是线性插值气象站的缺测是常态凌晨设备断连、维护关机都会产生 NaN。处理策略不是一刀切而是看缺测的形态。短时间缺测用前向填充就够把前一小时的观测值顺延下去物理含义上说得通连续几天的缺测再往前填就不合理了要用插值把中间的空洞补出来。# 短时间缺测前向填充保留观测的趋势惯性 df[temperature] df[temperature].ffill() # 连续性缺测线性插值按相邻点的均值补齐 df[humidity] df[humidity].interpolate(methodlinear) # 异常值处理用 3 倍标准差窗口筛掉离谱记录 import numpy as np temp_mean df[temperature].mean() temp_std df[temperature].std() df df[np.abs(df[temperature] - temp_mean) 3 * temp_std] print(f清洗后剩余 {df.shape[0]} 行)ffill()适合 13 条的短缺口interpolate(methodlinear)适合更长的缺口它会按两端的观测值做线性过渡。异常值处理这里用的是最朴素的 3σ 准则适合温度这类近似正态分布的变量湿度、降水量这类偏态分布变量不要用同样的方法后面做模型时再具体说。清洗后打印剩余行数是一个好习惯报告里写“保留了多少数据”就是从这里来的。2.3 时间重采样日数据怎么变成月和季度逐日数据画出来噪声很大趋势被每天的波动淹没。常见做法是先做重采样把日数据聚合成月、季、年的统计量再看长期趋势。# 逐月平均气温 monthly_temp df[temperature].resample(M).mean() # 逐季度降水量加总 quarterly_precip df[precipitation].resample(Q).sum() # 按自然月分组统计观察季节性周期 monthly_avg_by_calendar df.groupby(df.index.month)[temperature].mean() print(monthly_avg_by_calendar)resample(M)是按月聚合Q是按季度。聚合函数按业务含义选气温取均值合理降水量取总和更合理——你不会关心某季度的“平均总降水量”只会关心“这个季度下了多少”。最后一行groupby(df.index.month)不做时间聚合而是把 112 月的所有历史数据揉在一起算均值用来观察气温的季节性周期。这一步做完你就有了清洗后的三个数据集原始日数据、月汇总、季汇总后面画图和建模各取所需。3. 探索性分析从分布、相关和趋势里挖出气象规律3.1 温度分布直方图加箱线图组合看探索性分析最容易犯的错是直接画折线图看全貌看完啥也说不出来。正确的顺序是先看分布形态再看时间趋势。温度分布同时用直方图和按月箱线图看能回答两个不同的问题整体集中在哪个区间季节间差异有多大import seaborn as sns import matplotlib.pyplot as plt fig, axes plt.subplots(1, 2, figsize(12, 4)) # 直方图看温度整体分布叠加核密度曲线 sns.histplot(df[temperature], kdeTrue, bins30, axaxes[0]) axes[0].set_title(Temperature Distribution) # 按月箱线图看季节差异和异常值 sns.boxplot(xdf.index.month, ydf[temperature], axaxes[1]) axes[1].set_title(Monthly Temperature Distribution) plt.tight_layout() plt.show()bins30控制直方图分箱数量数据量大时可以适当加大。kdeTrue叠加的核密度曲线能直观看出分布是否对称——温度通常呈双峰形态夏季和冬季两个峰叠在一起这是季节性数据的特征。箱线图的xdf.index.month直接把索引的月份字段取出来分组不需要额外建列。从这个组合图里能得出报告里第一组可写结论比如“最高月均温出现在 7 月最低在 1 月年温差约 25 度”。3.2 相关性热力图谁在影响谁相关性分析是气象数据分析报告里最核心的一张图。但直接对全表跑corr()经常会报错——因为 DataFrame 里混着天气现象这类文本列。先筛选数值列再算相关是标准做法。# 只保留数值列防止 corr() 报错或给出无意义结果 numeric_cols df.select_dtypes(include[np.number]).columns corr df[numeric_cols].corr() # 用 mask 遮掉上三角图形更紧凑 mask np.triu(np.ones_like(corr, dtypebool)) sns.heatmap(corr, maskmask, annotTrue, cmapcoolwarm, vmin-1, vmax1, fmt.2f, linewidths0.5) plt.show()select_dtypes(include[np.number])把整数和浮点列挑出来过滤掉文本类别列。np.triu生成上三角布尔矩阵配合mask参数只显示下三角避免重复展示。annotTrue在每个格子里标出具体相关系数fmt.2f控制小数位。vmin-1, vmax1固定色阶范围不然每次跑的图颜色深浅没有可比性。实际数据里常见的结果是温度和湿度显著负相关和气压也是负相关湿度和降水量正相关。这四个关系写进报告就是一段有数据支撑的变量关系描述。3.3 滑动平均把噪声抹掉再看趋势日温度折线图是锯齿状的每年上百个数据点堆一起时眼睛根本分不出趋势。滑动平均是一种低成本降噪手段——用前后 N 天的均值替代当天值窗口越大曲线越平滑。# 30 天滑动平均抹掉短期波动 df[temp_ma30] df[temperature].rolling(window30, centerTrue).mean() plt.figure(figsize(12, 5)) plt.plot(df.index, df[temperature], alpha0.3, linewidth0.8, labelDaily) plt.plot(df.index, df[temp_ma30], colorred, linewidth1.5, label30-day MA) plt.legend() plt.show()rolling(window30, centerTrue)的centerTrue表示用当前日的前后各 15 天做对称窗口这样平滑曲线不会滞后于原始数据。原始日数据用alpha0.3降低透明度当作背景红色滑动平均线作为主角。看这条线能不能看出年度周期、整体增温趋势决定了报告里“气候变化分析”这一小节怎么写。如果多跑几个窗口7 天、30 天、90 天能发现不同尺度的规律比如 90 天滑动平均能看出明显的年际波动。4. 建模实操用回归预测温度、用分类判断降水4.1 温度预测构造滞后特征再用线性回归探索性分析发现温度和湿度、气压有相关性这个发现直接转换为模型特征。但时间序列建模和普通回归有一个本质区别不能用随机切分训练集和测试集否则测试集里会混入时间上相邻、信息重叠的数据跑出来的 R² 虚高一到真实预测就崩。from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score df_model df[[temperature, humidity, pressure]].copy() # 构造滞后特征昨天温度和一周前温度 df_model[temp_lag1] df_model[temperature].shift(1) df_model[temp_lag7] df_model[temperature].shift(7) # 有滞后特征的样本前 7 行是 NaN直接丢掉 df_model df_model.dropna() # 按时间顺序切分不用 train_test_split 默认的随机切分 X df_model.drop(columns[temperature]) y df_model[temperature] split_idx int(len(df_model) * 0.8) X_train, X_test X.iloc[:split_idx], X.iloc[split_idx:] y_train, y_test y.iloc[:split_idx], y.iloc[split_idx:] model_lr LinearRegression() model_lr.fit(X_train, y_train) y_pred model_lr.predict(X_test) print(R2:, r2_score(y_test, y_pred)) print(RMSE:, mean_squared_error(y_test, y_pred, squaredFalse)) print(特征系数:, dict(zip(X.columns, model_lr.coef_)))shift(1)把温度整体下移一行得到“前一天温度”shift(7)得到“一周前温度”。这两个滞后特征在气象预测里非常有用——温度有很强的自相关性今天和昨天不像但和一周前往往很像。切分时用iloc[:split_idx]和iloc[split_idx:]按行位置切保证训练集全部在测试集之前。特征系数能告诉你模型的判断逻辑如果temp_lag1的系数接近 0.9说明模型主要依赖昨天温度如果humidity系数为负说明湿度上升时预测温度下降。RMSE 的量纲和温度一致假设结果是 1.8意思是平均预测误差约 1.8 度这个数字要写进报告的模型评估段。4.2 降水预测类别不平衡才是真正的敌人预测“明天是否降雨”是一个二分类问题但气象数据里降雨日往往只占两到三成直接建模的话模型会学成“永远预测不下雨”因为这样准确率也有七八成。处理类别不平衡可以用class_weight参数也可以用更专业的重采样手段。from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report df_cls df[[humidity, pressure, temperature, precipitation]].copy() # 构造标签明天降水量超过 1mm 记为降雨日 df_cls[rain_tomorrow] (df_cls[precipitation].shift(-1) 1.0).astype(int) df_cls df_cls.dropna() Xc df_cls.drop(columns[rain_tomorrow, precipitation]) yc df_cls[rain_tomorrow] split_idx int(len(df_cls) * 0.8) Xc_train, Xc_test Xc.iloc[:split_idx], Xc.iloc[split_idx:] yc_train, yc_test yc.iloc[:split_idx], yc.iloc[split_idx:] # class_weightbalanced 自动给少数类更高权重 model_rf RandomForestClassifier( n_estimators200, max_depth6, class_weightbalanced, random_state42 ) model_rf.fit(Xc_train, yc_train) print(classification_report(yc_test, model_rf.predict(Xc_test)))shift(-1)是取“明天的降水量”和预测目标对应。阈值选 1mm 而不是 0是为了过滤掉那种象征性飘几滴的无效降雨业务上更关心“能湿地的雨”。class_weightbalanced让降雨类样本获得更高权重。n_estimators200是树的数量max_depth6限制每棵树的深度防过拟合random_state42固定随机种子保证结果可复现。看结果不要只盯着 accuracy重点看classification_report里 1.0 那一类降雨日的 recall——如果 recall 偏低说明模型经常漏报降雨这套特征还需要加强。气压、湿度的特征重要性可以从model_rf.feature_importances_里取出来排序这也是报告里“变量贡献度分析”一节的素材。5. 避坑与排查时序数据、缺测和季节性的五个典型坑5.1 时序数据随机切分导致 R² 虚高现象线性回归跑出来的 R² 接近 0.98比预期好太多换个时间段数据重新训练立刻掉到 0.7。原因train_test_split默认随机打乱数据测试集里混入了和训练集时间相邻的样本。滞后特征会把邻近日期的信息泄露给模型测试时看到的其实是“昨天见过”的数据。解决改成按时间顺序手动切分split_idx int(len(df) * 0.8)后再iloc切。时间序列建模这一步不能偷懒一句话凡是特征里带shift的都必须按时间切分。5.2 resample 后出现一列 NaN现象df[temperature].resample(M).mean()跑完得到全 NaN或者报TypeError: Only valid with DatetimeIndex。原因日期列没转datetime类型或者还没设为索引。resample要求索引是日期时间类型字符串索引上它不识别。解决先pd.to_datetime()转类型再set_index()设为索引最后sort_index()排序。这三步是气象数据处理的标准前置三连缺一步后面全崩。5.3 去除 NaN 和异常值后行数对不上现象做 EDA 时发现数据有 10 万行建模时 dropna 后只剩 8 万行报告里写“数据总量”时前后矛盾。原因滞后特征shift(1)和shift(7)会让前 7 行产生 NaN构造标签时shift(-1)又会让最后一行产生 NaN。每一处 dropna 都会砍掉一批样本。解决在报告里分写两个数字——采集到的原始行数和建模有效行数并注明“因构造滞后特征舍弃 N 行”。这样审报告的人一眼就能看清数据的处理路径。5.4 降水模型的 recall 一直是 0现象分类报告显示降雨类别的 recall 0模型每一条都预测“不下雨”。原因数据不平衡 评估指标选错。降雨日占比低于 30% 时模型发现全预测 0 就能拿 70% 准确率自然不会去学降雨模式。盯着 accuracy 看完全看不出来问题。解决class_weightbalanced给少数类加权评估时主要看降雨类的 recall 和 F1-score。另一个手段是把降水阈值从 0 改成 1mm过滤掉毛毛雨后类别分布更合理。5.5 中文标签在图上全是方块现象图标题和坐标轴标签的中文全显示成方框英文正常。原因matplotlib 默认字体不包含中文字符Windows 和 Linux 的可用字体还不一样。解决画图前加两行配置plt.rcParams[font.sans-serif] [SimHei]或者[Noto Sans CJK SC]另加plt.rcParams[axes.unicode_minus] False解决负号显示问题。配置放在 Notebook 的第一个 cell 里执行一次后面所有图都生效。6. 把分析结果落成报告图表选型、参数收敛与结论落地数据跑完只是做完了一半交付一份能说服人的报告才是终点。这里有一套我反复用的图型选型规则时间趋势用折线加滑动平均线分布形态用直方图加核密度曲线变量关系用散点图加回归拟合线或直接用相关性热力图模型效果用预测值对真实值的散点理想情况下点应该贴近 yx 对角线。按这个规则选出来的图读者扫一眼就能抓住重点不用你逐张解释。统计参数在写报告时要做一次收敛。全局随机种子random_state42保证模型结果可复现这在交叉验证时尤其关键——你不希望换台机器重跑一次结果就变了。清洗环节要记录处理前和处理后的行数比如“原始数据 98,236 行去除缺失值及异常值后保留 95,104 行保留率 96.8%”。这个数字是报告的信任基石审的人看到你的数据清洗是透明的模型结论才可信。模型评估参数统一用 RMSE 和 R²气温预测的 RMSE 是带量纲的直接写“平均预测误差约 1.6 度”比罗列一堆指标更直观。报告的结论段要写成有数字支撑的句子而不是“温度有明显周期”这种空话。比如“分析期内年均温较前一年上升 0.6 度30 天滑动平均曲线显示冬季增温趋势显著”“相对湿度与气温相关系数 -0.68呈中度负相关夏季高温时段湿度低”。每一条结论后面要能对应到报告里的一张图和一组数字。有一次我交付报告时对方导师盯着模型评估段问了句“你这个 RMSE 是温度预测的还是湿度预测的”我这才发现自己写报告时忘了标注变量的量纲同一个指标放在不同模型下面含义完全不同。从那以后我每次交付都会在结论段之前加一行说明——从清洗策略、参数配置到评估指标的单位一次性列全避免看报告的人去猜。希望这份气象分析资源的拆解笔记能让你少走这些弯路。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/21 8:17:06

神经形态计算:类脑AI的三大技术路线与产业投资评估框架

聊AI硬件的人,最近高频绕不过一个词:神经形态计算。它还有个更容易被大众接受的说法叫类脑AI。核心不再是堆芯片、堆显存、堆算力,而是从架构层面模仿人脑的脉冲式信息处理机制,用极低功耗完成实时感知和决策。偏偏这样一条偏科研…

2026/10/21 8:17:06

三级信息安全技术备考:攻防链路与高频考点全解析

如果你问我三级信息安全技术这门考试最怕什么,我的答案不是算法题,也不是配置命令,而是“感觉什么都背过,一选还是错”。备考那阵子,我把加密算法、防火墙模式、黑客攻击流程一个个抄在小本子上,结果做真题…

2026/10/21 8:17:06

Java Web数据库系统实例:从三层架构到项目部署排错全解析

简介:面向Java Web开发者的源码与视频学习包,围绕数据库系统应用开发展开,覆盖Servlet、JSP、JDBC、MVC设计模式以及Spring MVC/Struts等主流框架,同时结合MySQL、Oracle等数据库实战,适合需要从基础语法起步、逐步掌握…

2026/10/21 9:18:10

Ceph RBD删除后空间未释放?trash清理与对象回收实战指南

处理这种问题,我的第一反应是:先别急着扩容,也别怀疑删除操作失败。ceph df显示的空间没变化,十有八九是对象没被真正清掉,或者删除流程还没走完。标题里提到的“删除rbd的数据”,大概率是通过rbd rm或rbd …

2026/10/21 9:18:10

2026本科毕业论文AI工具推荐:导师认可与风险避坑指南

每年一到三四月份,我手机上总会被学弟学妹们塞满各种AI工具的截图,问得最多的一句话就是:“学长,导师推荐的AI论文软件到底是哪几款?网上榜单太多了,看得人头晕。”说实话,2026年这个时间点&…

2026/10/21 9:18:10

从零搭建代码评审自动化流水线:轻量钩子与CI脚本的工程实践

1. 从零搭建一套代码评审自动化流水线,我踩过的坑和最终沉淀的方案代码评审这件事,做久了你会发现一个规律:凡是靠人自觉去执行的流程,最后都会退化成走过场。我所在的团队大概二十来号人,后端前端加起来每天合并的PR少…

2026/10/21 9:18:10

从零复现lerobot:环境配置、训练与部署全流程踩坑记录

1. 复现之前,先把“复现目标”说清楚最近一直在折腾 lerobot 这个开源机器人学习框架的复现,从环境搭建到训练出自己的一个模仿学习策略,整个过程踩了不少坑,也把很多文档里没写明白的细节摸清楚了。如果你正准备复现这个项目&…

2026/10/21 9:18:10

DINO无标签蒸馏:从知识蒸馏到自监督学习的范式革新

DINO,全称DIstillation with NO labels——蒸馏,但没有标签。我第一次看到这个名字的时候愣了一下:知识蒸馏不是必须有老师、学生、还有正确答案吗?DINO告诉你,老师可以有,学生可以学,唯独那个“…

2026/10/21 9:13:05

养老机构智慧化改造实战:设备选型、成本测算与补贴申报

这几年做养老机构的人,应该都能感到一阵明显的风向变化。上个月我去一位做了多年养老的朋友那里走访,他一边泡茶一边跟我说了句话,我到现在还记得很清楚:“以前是我们求着老人来住,家属来了问的第一句是床位多少钱&…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/21 0:00:35

交通流仿真实战:IDM跟驰与MOBIL换道模型参数调优与避坑指南

简介:这份资源是面向交通工程学习者与Python开发者的微观交通流仿真项目,核心实现智能驾驶模型(IDM)下的车辆跟驰与换道行为,可用于理解速度、密度与流量之间的动态关系,适合具备Python基础、希望深入交通模…

2026/10/21 0:00:35

揭穿智能体表面顺从:用追踪代码重建任务执行确定性

1. 表面顺从不是智能体的“礼貌”,而是任务执行链路上的隐性断点最近在调试一个跨平台长周期任务调度系统时,我反复遇到一种令人困惑的现象:智能体在用户指令发出后,几乎秒级响应“已收到”“正在处理”“请稍候”,UI上…

2026/10/21 0:00:35

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑