
简介本资源为气象数据分析实验的完整配套材料面向数据分析初学者、高校学生及需要完成天气数据实验报告的读者。内容以爬虫代码抓取中国天气网指定城市的天气数据为起点完成数据清洗、统计分析与可视化呈现涵盖雷达图、条形图等多种图表并附有分析说明帮助读者理解从数据获取到结论输出的完整流程。压缩包共39个文件以20个png图表、15个xml配置与文档结构文件、4个rels关系文件为主整体约1.69MB源代码可直接在Jupyter Notebook中运行便于复现与二次修改。资源同时包含整理后的实验报告结构完整适合作为课程作业参考或数据分析入门练手项目。目前已有1853人学习下载读者可借此掌握爬虫采集、数据整理、图表绘制与报告撰写等实用技能。1. 气象数据分析资源包从原始观测到可复现报告的一条龙拆解做气象数据分析的人多半经历过这种场面手头拿到一批地面观测站或再分析数据字段名是英文缩写时间列是字符串缺测值用 -9999 表示领导要一份能看趋势、能出图、能写进报告的分析结论。这时候真正卡住你的往往不是算法而是数据清洗、时间对齐、缺测处理和图表规范这一整套流程。这份气象分析资源包就是冲着这个场景来的它把数据读取、质量控制、统计计算、可视化到报告输出的链路打包成可复用的脚本和模板适合气象、环境、农业、能源等方向做数据分析的从业者和学生。你不需要从零搭框架照着改参数就能跑通自己手头的数据。2. 数据读取与质量控制把 -9999 和乱序时间先收拾干净2.1 为什么气象数据的第一步永远是清洗气象观测数据的脏是出了名的。常见来源包括地面自动站逐小时数据、探空数据、再分析格点数据格式有 CSV、Excel、NetCDF、HDF 等。不同来源的字段命名、单位、缺测标记、时间基准都不一样。比如温度有的用摄氏度有的用开尔文风速有的用 m/s 有的用 knot气压有的用 hPa 有的用 Pa。如果不先统一后面算出来的统计量全是错的。资源包里通常会把读取和清洗拆成独立模块我一般会先做三件事统一时间列为标准 datetime 格式、把缺测值替换成 NaN、统一物理量单位。这三步做完后面的分析才有意义。很多人跳过清洗直接画图结果图上出现一根掉到 -9999 的直线这就是典型的翻车现场。2.2 读取与清洗的可抄作业代码下面这段代码演示了从 CSV 读取气象数据、处理缺测值、统一时间格式和单位的基本流程。实际使用时把文件路径和字段名换成你自己的即可。import pandas as pd import numpy as np # 读取原始观测数据假设字段为英文缩写 df pd.read_csv(station_obs.csv, encodingutf-8) # 查看原始字段和前几行确认列名含义 print(df.columns.tolist()) print(df.head()) # 将常见缺测标记统一替换为 NaN missing_flags [-9999, -999, 9999, 9999, , NaN] df df.replace(missing_flags, np.nan) # 时间列转标准 datetime处理多种常见格式 df[datetime] pd.to_datetime(df[datetime], errorscoerce) # 按时间排序气象数据顺序错乱会导致滑动统计出错 df df.sort_values(datetime).reset_index(dropTrue) # 单位统一温度开尔文转摄氏度风速 knot 转 m/s if df[temp].mean() 100: df[temp] df[temp] - 273.15 df[wind_speed] df[wind_speed] * 0.514444 # 输出清洗后数据概览 print(df[[datetime, temp, wind_speed]].describe())逻辑说明先读取再检查列名是因为不同数据源的字段缩写差异很大盲目按位置取列容易错位。缺测标记替换成 NaN 是为了让后续统计函数自动跳过而不是把 -9999 当成真实低温参与平均。时间列用errorscoerce是为了把无法解析的值变成 NaT方便后续筛掉。单位判断用均值阈值是一种常见做法但更稳妥的方式是查数据字典这里只是演示。参数说明missing_flags列表要根据你实际数据里的缺测标记补充pd.to_datetime的errors参数建议保持coerce避免一条脏数据导致整个脚本报错排序步骤不能省否则滑动平均和累计量会算错。2.3 质量控制的两个关键检查清洗完之后质量控制至少要做两项。第一是范围检查比如温度超出 -60 到 60 摄氏度、风速为负值、相对湿度超过 100% 的记录要标记为可疑。第二是时间连续性检查逐小时数据如果出现大段缺失后面做日统计和月统计时要在报告里注明有效样本数不能默认全有。# 范围检查标记物理上不合理的值 df.loc[(df[temp] -60) | (df[temp] 60), temp] np.nan df.loc[df[wind_speed] 0, wind_speed] np.nan df.loc[(df[rh] 0) | (df[rh] 100), rh] np.nan # 时间连续性检查统计每小时应有记录数与实际记录数 expected pd.date_range(df[datetime].min(), df[datetime].max(), freqh) actual df[datetime].dropna().unique() missing_ratio 1 - len(actual) / len(expected) print(f时间缺失比例: {missing_ratio:.2%})这两步做完你手里才是一份能拿去做分析的数据。资源包里一般会把这些检查封装成函数调用时传字段名和阈值即可不用每次重写。3. 统计分析与可视化把逐小时数据变成能写进报告的结论3.1 从逐小时到日统计的聚合逻辑气象分析报告里最常见的需求是日平均、日最高最低、日累计降水、风向频率等。逐小时数据转日统计看起来简单但有几个坑日平均不是简单把 24 个数加起来除以 24如果中间有缺测有效样本数不足时要标注日最高最低要基于有效值降水累计要处理缺测时段不能把缺测当 0。# 确保 datetime 为索引方便按日重采样 df df.set_index(datetime) # 日统计聚合不同要素用不同方法 daily pd.DataFrame({ temp_mean: df[temp].resample(D).mean(), temp_max: df[temp].resample(D).max(), temp_min: df[temp].resample(D).min(), precip_sum: df[precip].resample(D).sum(min_count1), wind_mean: df[wind_speed].resample(D).mean(), valid_hours: df[temp].resample(D).count() }) # 有效样本不足 18 小时的日统计标记为不可靠 daily[reliable] daily[valid_hours] 18 print(daily.head(10))逻辑说明resample(D)按自然日聚合min_count1保证全缺测的日期返回 NaN 而不是 0这对降水尤其重要否则会把缺测日误判为无降水日。valid_hours统计每天有效温度记录数用来判断该日统计是否可靠。参数说明resample的频率字符串可改为M做月统计、Y做年统计min_count根据要素调整温度一般不需要降水必须加。3.2 可视化让图表直接能进报告报告里的图不需要花哨但必须清晰、有单位、有时间轴、有缺测说明。资源包通常会提供一套绘图模板包括时间序列曲线、风玫瑰图、降水柱状图、气温距平图等。下面演示时间序列和风玫瑰的基本画法。import matplotlib.pyplot as plt import numpy as np # 时间序列气温与降水双轴图 fig, ax1 plt.subplots(figsize(12, 4)) ax1.plot(daily.index, daily[temp_mean], colortab:red, label日均温) ax1.set_ylabel(温度 (℃)) ax1.set_xlabel(日期) ax2 ax1.twinx() ax2.bar(daily.index, daily[precip_sum], colortab:blue, alpha0.4, label日降水) ax2.set_ylabel(降水 (mm)) plt.title(日均温与日降水时间序列) fig.legend(locupper right) plt.tight_layout() plt.savefig(temp_precip_series.png, dpi150)逻辑说明双轴图适合展示量纲不同的两个要素但要注意左右轴颜色与曲线对应避免读者误读。dpi150保证报告插图清晰。风玫瑰图需要风向和风速两个字段通常按 16 方位分箱统计频率资源包里会有现成函数。参数说明figsize根据报告排版调整一般宽度 10 到 12 英寸alpha控制柱状图透明度避免遮挡曲线保存格式建议 PNG 用于文档PDF 用于印刷。3.3 报告实验把分析结果组织成可复现文档“报告实验”这个词在数据分析场景里通常指把分析过程、参数、结果和结论整理成一份可复现的文档。资源包一般会提供 Markdown 或 Jupyter Notebook 模板里面预置了数据说明、方法、结果、图表和结论几个区块。我的习惯是每个图表下面紧跟一段文字说明写清楚数据来源、统计时段、有效样本数和异常说明。这样别人拿到报告能直接判断结论可信度而不是只看一张图。提示报告里所有统计量都要注明单位和统计时段缺测比例超过 10% 的要素要在结论里加限制说明。4. 避坑与排查气象数据分析里最容易翻车的五个地方4.1 时间时区没统一日统计整体偏移现象日最高温出现在凌晨日统计曲线整体平移了几个小时。原因数据源有的用世界时有的用本地时混在一起没转换。解决读取时先确认时间基准统一转成同一时区再做重采样资源包里一般有时区转换函数调用时显式传入原始时区。4.2 缺测值当真实值参与统计现象某日平均温度异常偏低检查发现当天有大量 -9999。原因清洗步骤漏了某个字段的缺测标记或者替换后没有重新检查。解决清洗后对每个要素做描述性统计看最小值和最大值是否合理发现异常值回头查缺测标记列表。4.3 降水累计把缺测当 0现象月降水量明显偏少但实际有降水过程。原因resample().sum()默认把 NaN 当 0 处理。解决加min_count1并在日统计里记录有效小时数月累计时只累加可靠日。4.4 风向平均用算术平均现象风向频率图与实际感受不符。原因风向是角度量0 度和 360 度是同一方向直接算术平均会得到错误结果。解决风向统计用矢量平均或频率分箱不要用简单平均。资源包里风玫瑰函数已经处理了这个问题。4.5 图表单位缺失导致误读现象报告里温度曲线被误读为华氏度。原因图轴没标单位正文也没说明。解决所有图表轴标签必须带单位正文首次出现时说明单位制资源包模板里已预置单位标注改数据时别把标签删了。5. 进阶技巧用配置驱动让同一套脚本跑不同站点资源包用久了会发现真正省时间的不是某个算法而是把可变部分抽成配置。我一般会建一个 YAML 或 JSON 配置文件把文件路径、字段映射、单位转换、缺测标记、统计时段、输出目录都写进去脚本只读配置不写死参数。这样换一个站点或换一批数据只改配置不改代码复现成本极低。import yaml # 读取配置文件 with open(config.yaml, r, encodingutf-8) as f: cfg yaml.safe_load(f) # 配置示例结构 # data_path: station_obs.csv # time_col: datetime # missing_flags: [-9999, 9999] # unit_convert: # temp: K_to_C # wind_speed: knot_to_ms # resample_freq: D # output_dir: output df pd.read_csv(cfg[data_path]) df df.replace(cfg[missing_flags], np.nan) df[datetime] pd.to_datetime(df[cfg[time_col]], errorscoerce) # 后续按配置做单位转换和重采样逻辑说明配置驱动的核心是把“数据长什么样”和“怎么处理”分开。字段映射解决不同数据源列名不一致的问题单位转换配置解决量纲问题缺测标记配置解决脏值问题。参数说明resample_freq可设为D、M、Youtput_dir建议按站点或时段分目录避免多次运行结果覆盖。验证方法上我习惯用一份已知结果的小样本数据跑回归测试拿 3 天数据手工算一遍日均温和降水累计再和脚本输出对比误差在浮点精度内才算通过。这个习惯是从一次报告数据对不上开始养成的从那以后我每次改完清洗或聚合逻辑都强制走一遍小样本验证确认没把之前的正确结果改坏。希望帮到你。本文还有配套的精品资源点击获取