数据基础:气象数据来源与获取方法

做农产品量化建模,说白了就是跟天气数据打交道。我做了这么多年农业数据,发现很多新手上来就急着建模,结果数据源都没搞清楚,最后模型跑出来全是噪音。今天咱们就聊聊气象数据的三大来源,以及怎么把它们搞到手。

三大主流气象数据源

我个人习惯把气象数据源分成三类:官方气象局、卫星遥感、再分析数据。这三类各有各的脾气,咱们一个一个说。

1. 国家气象局(CMA)数据

国内做农业模型,首选肯定是国家气象局的数据。为什么?因为它是地面观测站实测的,精度最高。我在项目中遇到过,用NASA的数据预测小麦产量,结果跟实际差了20%,换成CMA数据后误差直接降到5%以内。

CMA数据的特点:

  • 站点数据:全国2400多个国家级气象站,每天8次观测
  • 要素齐全:温度、降水、日照、风速、湿度,该有的都有
  • 历史长:大部分站点从1951年开始记录
  • 获取方式:通过中国气象数据网(data.cma.cn)申请
注意:CMA数据不是免费的!个人申请需要填写用途说明,企业用户要付费。我曾经帮一个创业团队申请过,从提交到审批花了整整两周。

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)} 天的温度数据")
小技巧:NASA POWER的API有请求限制,每分钟最多60次。如果你要批量获取多个地点的数据,记得加个time.sleep(1)避免被封。

从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)
避坑指南:我曾经遇到过CMA数据中部分站点有缺失值,特别是偏远地区的气象站。拿到数据后第一件事就是做缺失值检测,别直接扔进模型。

从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())
个人经验:NOAA的NetCDF文件通常很大,一个全球数据文件可能几百MB。我建议先下载区域子集,或者用xarray的chunk功能分块读取,别把内存撑爆了。

数据质量与预处理

数据拿到手了,不代表就能直接用。我总结了几条经验:

  1. 时间对齐:不同数据源的时间分辨率可能不同,CMA是3小时一次,NASA是每天一次,NOAA是6小时一次。建模前必须统一时间尺度。
  2. 空间匹配:站点数据是点,网格数据是面。我通常用反距离加权法把站点数据插值到网格上,或者反过来取网格平均值。
  3. 缺失值处理:气象数据经常有缺失,特别是极端天气时设备容易坏。我个人习惯用前后3天的平均值填充,别用0填充,那会严重扭曲模型。
  4. 异常值检测:比如温度突然跳到50°C,那肯定是传感器故障。用3σ原则或者IQR方法剔除。

知识体系总览

下面这张图是我自己画的,把三大数据源的关系和获取流程串起来了。你想想看,做量化建模就像盖房子,数据就是地基。地基没打好,房子再漂亮也得塌。

气象数据获取知识体系 国家气象局 (CMA) NASA POWER NOAA 再分析 API / FTP / 网页下载 RESTful API NetCDF / GRIB 下载 CSV / JSON / XML JSON / CSV NetCDF / GRIB 数据预处理:时间对齐 → 空间匹配 → 缺失值填充 → 异常值检测 最终输出:标准化的时间序列数据,可直接用于量化建模

核心要点:

  • 国内精细建模用CMA,全球快速原型用NASA,长周期气候分析用NOAA
  • 数据获取只是第一步,预处理才是真正花时间的地方
  • 不同数据源之间要交叉验证,别盲目相信任何一个

好了,气象数据这块就聊到这儿。数据拿到手之后,下一步就是怎么把这些天气数据转化成模型能用的特征。这个咱们后面再细说。

专注资料整理