数据基础:气象数据来源与获取方法
做农产品量化建模,说白了就是跟天气数据打交道。我做了这么多年农业数据,发现很多新手上来就急着建模,结果数据源都没搞清楚,最后模型跑出来全是噪音。今天咱们就聊聊气象数据的三大来源,以及怎么把它们搞到手。
三大主流气象数据源
我个人习惯把气象数据源分成三类:官方气象局、卫星遥感、再分析数据。这三类各有各的脾气,咱们一个一个说。
1. 国家气象局(CMA)数据
国内做农业模型,首选肯定是国家气象局的数据。为什么?因为它是地面观测站实测的,精度最高。我在项目中遇到过,用NASA的数据预测小麦产量,结果跟实际差了20%,换成CMA数据后误差直接降到5%以内。
CMA数据的特点:
- 站点数据:全国2400多个国家级气象站,每天8次观测
- 要素齐全:温度、降水、日照、风速、湿度,该有的都有
- 历史长:大部分站点从1951年开始记录
- 获取方式:通过中国气象数据网(data.cma.cn)申请
2. NASA POWER 数据
如果你做的是全球范围的农产品建模,或者拿不到CMA数据,NASA POWER是个好选择。它是卫星遥感数据,覆盖全球,而且完全免费。
NASA POWER的优势:
- 全球覆盖:从赤道到两极,任何地方都能拿到数据
- 时间跨度:1981年至今,每天更新
- 空间分辨率:0.5° × 0.5°(约50km网格)
- 获取方式:通过API直接调用,或者网页下载
嗯,这里要注意。NASA数据是网格化的,不是站点数据。你想想看,一个50km的网格里可能有几十个农场,数据是平均值。做精细建模时,这个精度可能不够。
3. NOAA 再分析数据
NOAA(美国国家海洋和大气管理局)的再分析数据,说白了就是把历史观测数据用气象模型重新跑一遍,得到更完整、更一致的数据集。我个人做长周期(30年以上)的农产品价格预测时,特别喜欢用这个。
NOAA的明星产品:
- NCEP/NCAR Reanalysis:1948年至今,全球覆盖
- CFSR:1979-2010年,更高分辨率
- ERA5:欧洲中期天气预报中心的产品,但NOAA也提供接口
| 数据源 | 空间分辨率 | 时间跨度 | 获取难度 | 推荐场景 |
|---|---|---|---|---|
| CMA | 站点级 | 1951-至今 | 中等(需审批) | 国内精细建模 |
| NASA POWER | 0.5°网格 | 1981-至今 | 简单(免费API) | 全球/快速原型 |
| NOAA | 0.25°-2.5° | 1948-至今 | 中等(需处理NetCDF) | 长周期/气候分析 |
数据获取实战
光说不练假把式。我直接上代码,咱们看看怎么把数据搞到手。
从NASA POWER获取数据
这是最简单的,一个API请求就搞定。我个人习惯用Python的requests库,几行代码就能拿到数据。
import requests
import json
# 定义参数
params = {
'parameters': 'T2M,PRECTOTCORR,ALLSKY_SFC_SW_DWN',
'community': 'RE',
'longitude': 116.4,
'latitude': 39.9,
'start': '20200101',
'end': '20201231',
'format': 'JSON'
}
# 发送请求
url = 'https://power.larc.nasa.gov/api/temporal/daily/point'
response = requests.get(url, params=params)
data = response.json()
# 提取温度数据
temperatures = data['properties']['parameter']['T2M']
print(f"获取到 {len(temperatures)} 天的温度数据")
从CMA获取数据
CMA的数据获取稍微麻烦点。你需要先注册账号,然后申请数据权限。审批通过后,可以通过FTP或者API下载。
我曾经帮一个农业保险公司做过项目,需要全国2000多个站点的历史数据。申请流程走了两周,最后拿到的是CSV格式的压缩包,解压后大概5GB。
# CMA数据下载示例(伪代码)
# 实际使用时需要替换为你的API Key
import requests
# 设置请求头
headers = {
'Authorization': '你的API Key',
'Content-Type': 'application/json'
}
# 查询站点列表
url = 'https://data.cma.cn/api/v1/station'
response = requests.get(url, headers=headers)
stations = response.json()
# 下载某个站点的数据
station_id = '54511' # 北京站
params = {
'station': station_id,
'elements': 'TEM,PRS,RHU,WIN',
'start': '2020-01-01',
'end': '2020-12-31'
}
url = 'https://data.cma.cn/api/v1/data'
response = requests.get(url, params=params, headers=headers)
从NOAA获取再分析数据
NOAA的数据格式比较特殊,通常是NetCDF格式。你需要用专门的库来读取。
import xarray as xr
import pandas as pd
# 打开NetCDF文件
ds = xr.open_dataset('ncep_2020.nc')
# 查看数据结构
print(ds)
# 提取北京地区(39.9°N, 116.4°E)的温度数据
temp = ds['air'].sel(lat=39.9, lon=116.4, method='nearest')
temp_df = temp.to_dataframe()
# 转换为日期格式
temp_df.index = pd.to_datetime(temp_df.index)
print(temp_df.head())
数据质量与预处理
数据拿到手了,不代表就能直接用。我总结了几条经验:
- 时间对齐:不同数据源的时间分辨率可能不同,CMA是3小时一次,NASA是每天一次,NOAA是6小时一次。建模前必须统一时间尺度。
- 空间匹配:站点数据是点,网格数据是面。我通常用反距离加权法把站点数据插值到网格上,或者反过来取网格平均值。
- 缺失值处理:气象数据经常有缺失,特别是极端天气时设备容易坏。我个人习惯用前后3天的平均值填充,别用0填充,那会严重扭曲模型。
- 异常值检测:比如温度突然跳到50°C,那肯定是传感器故障。用3σ原则或者IQR方法剔除。
知识体系总览
下面这张图是我自己画的,把三大数据源的关系和获取流程串起来了。你想想看,做量化建模就像盖房子,数据就是地基。地基没打好,房子再漂亮也得塌。
核心要点:
- 国内精细建模用CMA,全球快速原型用NASA,长周期气候分析用NOAA
- 数据获取只是第一步,预处理才是真正花时间的地方
- 不同数据源之间要交叉验证,别盲目相信任何一个
好了,气象数据这块就聊到这儿。数据拿到手之后,下一步就是怎么把这些天气数据转化成模型能用的特征。这个咱们后面再细说。