告别数据荒!手把手教你从NCDC和Reliable Prognosis获取中国气象站点数据(附Python处理脚本)
气象数据获取与处理实战指南从数据荒到高效分析最近在帮一位地理信息系统专业的研究生处理气象数据时发现很多研究者都面临同样的困境——要么找不到可靠的数据源要么数据格式混乱难以直接使用。这让我意识到气象数据的获取和预处理环节可能比想象中更耗费时间。本文将分享几个实用的解决方案帮助研究者们快速获取并处理中国区域的气象站点数据。1. 主流气象数据源深度评测选择合适的数据源是研究的第一步。经过实际测试和对比以下三个平台在数据覆盖范围和可用性方面表现突出1.1 NOAA国家环境信息中心(NCEI)作为美国国家海洋和大气管理局的下属机构NCEI提供了全球范围内的气象数据。其ISD-Lite数据集包含中国400多个气象站点的历史记录数据字段包括气温日最高/最低/平均降水量6小时累计风速和风向露点温度气压测量数据特点对比表指标NCEI优势NCEI局限性时间范围1901年至今部分中国站点2013-2019年数据缺失更新频率每日更新数据发布有3个月延迟数据格式标准化的CSV需要转换单位如降水×0.1获取方式FTP批量下载需要处理大量小文件提示使用NCEI数据时建议先检查目标站点的数据完整性特别是2013-2019年期间的中国站点数据。1.2 Reliable Prognosis平台这个由俄罗斯团队维护的平台提供了更友好的用户界面特别适合需要快速获取特定站点数据的场景# 示例通过API获取单站数据 import requests station_id 545110 # 北京站代码 start_date 20230101 end_date 20231231 params { station: station_id, start: start_date, end: end_date, elements: temp,precip # 气温和降水 } response requests.get(https://rp5.ru/data/archive/download, paramsparams) with open(fweather_{station_id}.csv, wb) as f: f.write(response.content)平台优势包括直接计算日/月/年统计值支持多种导出格式提供数据质量标识但需要注意仅支持单站查询部分站点数据存在间断降水数据可能存在系统偏差1.3 青藏高原科学数据中心对于研究中国西部地区的学者这个平台提供了独特的价值1km分辨率格点数据专门针对高原地区的优化算法包含ERA5再分析数据的区域优化版本2. 数据获取自动化方案手动下载和处理大量气象数据效率低下。以下是几种自动化方案2.1 NCEI数据批量下载import ftplib import os def download_ncei_data(station_ids, years, output_dir): ftp ftplib.FTP(ftp.ncdc.noaa.gov) ftp.login() for station in station_ids: for year in years: remote_path f/pub/data/noaa/isd-lite/{year}/{station}-99999-{year}.gz local_path os.path.join(output_dir, f{station}_{year}.gz) try: with open(local_path, wb) as f: ftp.retrbinary(fRETR {remote_path}, f.write) print(f下载成功: {station} {year}) except: print(f文件不存在: {station} {year}) ftp.quit() # 示例调用 stations [545110, 545270] # 北京和天津站 download_ncei_data(stations, range(2020, 2023), weather_data)2.2 数据质量快速检查获取数据后应立即进行基础检查import pandas as pd def check_data_quality(filepath): df pd.read_csv(filepath) # 检查缺失值比例 missing_ratio df.isnull().mean() # 检查异常值 temp_stats df[temperature].describe() precip_stats df[precipitation].describe() return { missing_data: missing_ratio, temperature_range: (temp_stats[min], temp_stats[max]), precipitation_max: precip_stats[max] }3. 降水数据处理实战原始数据中的降水记录往往需要特殊处理。以下是处理NCEI 6小时降水数据的完整方案3.1 数据清洗步骤无效值处理剔除-9999、0、-1等特殊值单位转换原始数据需除以10得到实际毫米数时间对齐处理不同时次的观测记录3.2 日降水量计算逻辑根据观测频率的不同采用三种计算策略稀疏数据每日1-3次观测直接取各次观测值的和或选择特定时次如08时、20时的观测常规数据每日4次观测标准做法00Z、06Z、12Z、18Z四个时次的和替代方案03Z、09Z、15Z、21Z时次的和当主要观测时次缺失时高密度数据每小时或每3小时累计24小时内的所有观测或滑动窗口累计3.3 Python实现代码import pandas as pd import numpy as np from pathlib import Path def process_precipitation(data_dir): result [] for file in Path(data_dir).glob(*.csv): df pd.read_csv(file) # 基础清洗 df df[~df[precip].isin([-9999, 0, -1])] df[precip] df[precip] / 10 # 单位转换 # 日期解析 df[date] pd.to_datetime(df[[year, month, day]]) # 按日期分组处理 daily df.groupby(date)[precip].agg([count, sum]) # 应用计算规则 def calc_daily(row): if row[count] 1: return row[sum] elif row[count] 3: # 获取3、9、15、21时的数据 sub df[(df[date] row.name) (df[hour].isin([3, 9, 15, 21]))] return sub[precip].sum() else: # 排除3、9、15、21时数据后求和 sub df[(df[date] row.name) (~df[hour].isin([3, 9, 15, 21]))] return sub[precip].sum() daily[daily_precip] daily.apply(calc_daily, axis1) result.append(daily.reset_index()) return pd.concat(result) # 使用示例 daily_precip process_precipitation(path_to_csv_files) daily_precip.to_csv(daily_precipitation.csv, indexFalse)4. 数据验证与交叉比对为确保数据可靠性建议采用以下验证方法4.1 多源数据对比选择2-3个数据源对关键指标进行交叉验证验证指标可接受偏差范围常见问题日最高气温±1.5°C时次选择差异日降水量±20%观测方法不同连续干旱日数±1天缺测处理方式4.2 统计一致性检查def validate_data(ground_truth, test_data): # 合并数据集 merged pd.merge( ground_truth, test_data, on[station_id, date], suffixes(_ref, _test) ) # 计算差异 merged[temp_diff] merged[temp_ref] - merged[temp_test] merged[precip_ratio] merged[precip_test] / merged[precip_ref] # 分析结果 validation_report { temperature: { MAE: merged[temp_diff].abs().mean(), correlation: merged[[temp_ref, temp_test]].corr().iloc[0,1] }, precipitation: { mean_ratio: merged[precip_ratio].mean(), nonzero_match: (merged[precip_ref] 0) (merged[precip_test] 0) } } return validation_report4.3 可视化验证使用matplotlib或Plotly绘制时间序列对比图直观检查季节变化模式是否一致极端事件是否同步记录长期趋势是否相似5. 高效管理气象数据的技巧经过多个项目实践总结出以下提高工作效率的方法数据组织规范按地区/年份/数据类型分级存储使用标准化的文件名如{站号}_{要素}_{起止日期}.csv每个数据集附带README说明数据来源和处理记录元数据管理记录各站点的经纬度、海拔高度标注数据缺失时段和质量问题保存原始下载文件和清洗后版本自动化工作流使用Airflow或Prefect调度定期数据更新将常用处理步骤封装为函数或类建立数据质量检查的自动化报告class WeatherDataPipeline: def __init__(self, config): self.stations config[stations] self.data_dir config[data_dir] def run(self): self.download_data() self.process_data() self.generate_report() def download_data(self): # 实现下载逻辑 pass def process_data(self): # 实现处理逻辑 pass def generate_report(self): # 生成数据质量报告 pass # 配置和运行 config { stations: [545110, 545270], data_dir: weather_data, years: [2020, 2021, 2022] } pipeline WeatherDataPipeline(config) pipeline.run()在处理青藏高原地区的气象数据时发现站点稀疏地区的格点数据产品往往比站点观测更具代表性。这提醒我们选择数据源时需要考虑研究区域的特点有时再分析数据可能比实测数据更适合特定研究需求。