甲烷浓度时空演变趋势分析与异常值计算(附下载脚本)
甲烷是继二氧化碳之后最重要的温室气体之一,其增温效应强、生命周期短,对近几十年的气候变化影响尤为显著。通过 Sentinel-5P 卫星的高分辨率观测数据,借助 Google Earth Engine 的时空分析能力,我们能够在区域和长期尺度上追踪甲烷浓度的变化轨迹,识别异常与趋势。这不仅有助于揭示能源消耗、农业排放与大气过程之间的关系,也为碳中和战略评估、空气质量改善和极端气候预警提供了关键的科学支撑。
01
研究意义
甲烷(CH₄)作为一种强效温室气体,其 温室效应潜能是二氧化碳的 28 倍以上,在短期气候变化中发挥着至关重要的作用。不同于二氧化碳的“长寿命效应”,甲烷在大气中的寿命约为 10 年,这意味着其浓度变化对 近几十年的气候演变有更直接的影响。
-
全球背景:联合国 IPCC 报告指出,甲烷排放削减是控制全球升温最有效的措施之一。
-
中国情境:中国作为世界上最大的农业国家和能源消费国,甲烷排放主要来源于 稻田、畜牧业、垃圾填埋场以及煤矿开采。对甲烷时空变化的精准监测,对“双碳战略”(碳达峰、碳中和)和温室气体减排政策具有重要意义。
-
研究价值:通过卫星遥感数据(Sentinel-5P),我们能够在全球和区域尺度上动态追踪甲烷浓度的变化规律,并结合异常与趋势分析,识别潜在的“排放热点”与“异常时段”。
简而言之,掌握甲烷浓度的时空格局 = 理解气候风险的重要钥匙。
02
脚本内容概览
本期教程基于 Google Earth Engine(GEE)平台,提供了一段可以直接运行的脚本。首先调用 Sentinel-5P 卫星的甲烷浓度产品(CH₄ column volume mixing ratio),研究范围既可以设为全国(如中国),也可以灵活选择某个省份或城市作为 ROI(Region of Interest)。
在此基础上,脚本会自动生成 2020–2023 的逐月甲烷浓度序列,并将结果绘制成时间序列图表,直观展示浓度随时间的波动。与此同时,我们还计算整体平均浓度,并将其与逐月数据对比,从而识别哪些月份出现了明显的偏高或偏低,形成一条异常值序列。为了进一步揭示长期演变趋势,脚本引入 Kendall’s τ 方法,对浓度变化进行统计检验,并以地图形式直观呈现甲烷在不同区域的“上升”与“下降”。
最后,所有的时间序列结果都可以一键导出为 CSV 文件,方便在 Python、R 或 Excel 中做更深入的分析与建模。
通过这套脚本,研究者不仅能在 GEE 平台上实现可视化探索,还能获得可下载的数据成果,真正做到科研与应用两不误。
03
代码基础拆解
下面以核心模块为例,逐步讲解:
-
行政区划加载
var provinces = ee.FeatureCollection("FAO/GAUL/2015/level1")
.filter(ee.Filter.eq('ADM0_NAME', 'China'));
选择中国作为研究范围。若研究省份级别,可以改成 "Beijing"
、"Guangdong"
等。
2. 数据加载与筛选
这里我们从 Sentinel-5P OFFL 数据库 中提取甲烷浓度,并按时间、空间范围筛选。
var sen5 = ee.ImageCollection("COPERNICUS/S5P/OFFL/L3_CH4")
.select(['CH4_column_volume_mixing_ratio_dry_air'], ['methane'])
.filterDate(time_start, time_end)
.filterBounds(roi);
3. 构建时间序列逐月平均处理,得到时间序列,便于后续制图。
var methane_monthly = ee.ImageCollection(
years.map(function(year) {
return months.map(function(month) {
var monthly = sen5.filter(ee.Filter.calendarRange(year, year, 'year'))
.filter(ee.Filter.calendarRange(month, month, 'month'))
.mean();
var date = ee.Date.fromYMD(year, month, 1);
return monthly.set('system:time_start', date.millis());
});
}).flatten()
);
4. 异常值计算
每个月减去长期平均值,突出显示“异常月份”。var anomaly = methane_monthly.map(function(img) {
return img.subtract(ave).rename('anomaly')
.copyProperties(img, img.propertyNames());
});
5. 趋势检测
一行代码就能实现趋势分析,结果可视化后可以看出哪里甲烷浓度有 显著上升 或 下降。
var trend = methane_monthly.reduce(ee.Reducer.kendallsCorrelation());
04
结果展示
-
时间序列折线图:展示 2020–2023 中国甲烷浓度变化,是否存在明显的季节波动?
-
异常值柱状图:直观显示哪些月份的甲烷浓度“异常偏高”或“偏低”。
-
平均空间分布图:绘制中国甲烷浓度的空间格局。
-
趋势分析图:标出浓度上升/下降的区域,揭示区域排放差异。
这些可视化结果让科研人员与公众都能快速理解数据的背后含义。
<< 滑动查看下一张图片 >>
图1:月均甲烷浓度(蓝色折线图)
整体趋势:
从 2020 年初到 2023 年底,北京的甲烷浓度呈现 逐步上升的趋势。
2020 年初浓度约在 1850 ppbv 左右;
到 2023 年底已接近 1940–1950 ppbv。
这表明在三年间,甲烷浓度整体上升了约 90–100 ppbv,属于显著增加。
波动特征:
曲线并不是单调上升,而是有明显的 周期性起伏。
2021 年、2022 年、2023 年都有春夏季小幅回落,秋冬季则普遍升高;
这可能与 采暖季能源消耗 或 气象条件(逆温层、扩散条件差) 有关。
图2:甲烷异常值序列(橙色柱状图)
2020 年:
甲烷浓度整体 低于长期平均水平,尤其是上半年,异常值最低接近 -40 ppbv。
这可能与当时疫情初期社会活动受限、能源消耗减少有关。
2021–2022 年:
浓度开始逐渐回归并超过平均水平。
2021 年整体接近基线(±10 ppbv 波动);
2022 年下半年出现持续正异常,说明甲烷浓度已稳定高于长期平均。
2023 年:
正异常显著增强,从春季到冬季均保持在 +10 ~ +25 ppbv,
表明北京在这一年甲烷浓度的“抬升态势”非常明显。
05
拓展方向
在掌握本期脚本的基础上,你可以尝试:
-
数据拓展
-
将甲烷与 NO₂、CO、臭氧(O₃) 等污染物数据结合,分析大气化学耦合效应。
-
融合 ERA5 再分析气象数据,研究温度、风速、边界层高度对甲烷浓度分布的影响。
-
方法拓展
-
使用 机器学习算法(如随机森林、XGBoost),预测甲烷浓度的变化趋势。
-
引入 时序分解方法(STL/SSA),区分长期趋势与季节性信号。
-
采用 极值理论(EVT),识别极端甲烷排放事件。
-
应用拓展
-
服务于 碳中和评估:定量核算区域甲烷排放贡献。
-
应用于 能源行业监管:分析煤矿区或油气田甲烷泄漏情况。
-
结合 农业排放,评估稻田甲烷排放与水稻种植季节的关系。
06
一键运行脚本
👉 本期脚本已经在 GEE 平台准备就绪,复制代码即可运行,快速生成 甲烷浓度时序图、异常值序列以及趋势分析地图。
建议在运行前调整参数:
regionName
:选择具体省份或区域;
time_start
、time_end
:修改研究时段;
scale
:根据研究尺度调整空间分辨率。
导出的结果可以在 Google Drive 里查看,也可继续在 Python/R 中进行更深层次的数据挖掘。
07
总结
本期教程带大家从 Sentinel-5P 甲烷观测数据 出发,学习如何用 GEE 平台实现 时序构建 → 异常检测 → 趋势分析 → 结果导出 的全流程。
通过这一套方法,你不仅能清晰掌握 2020–2023 中国甲烷浓度的时空格局,还能够拓展到 多污染物耦合分析、碳中和评估以及极端事件监测 等更前沿的研究方向。
/*
Sentinel-5P CH4
*/
// 1. 加载行政区边界(省份级)
var provinces = ee.FeatureCollection("FAO/GAUL/2015/level1")
.filter(ee.Filter.eq('ADM0_NAME', 'China'));
// 2. 选择一个省份,比如 "Beijing"
var regionName = "Beijing";
var roi = provinces.geometry(); // 整个中国
Map.centerObject(roi, 6);
Map.addLayer(roi, {color: 'red'}, "Selected Region: " + regionName);
// 3. 时间范围
var time_start = '2020-01-01';
var time_end = '2024-01-01';
// 4. 加载 S5P 甲烷数据
var sen5 = ee.ImageCollection("COPERNICUS/S5P/OFFL/L3_CH4")
.select(['CH4_column_volume_mixing_ratio_dry_air'], ['methane'])
.filterDate(time_start, time_end)
.filterBounds(roi);
// 5. 构建月均时间序列
var years = ee.List.sequence(2020, 2023);
var months = ee.List.sequence(1, 12);
var methane_monthly = ee.ImageCollection(
years.map(function(year) {
return months.map(function(month) {
var monthly = sen5
.filter(ee.Filter.calendarRange(year, year, 'year'))
.filter(ee.Filter.calendarRange(month, month, 'month'))
.mean();
var date = ee.Date.fromYMD(year, month, 1);
return monthly
.set('system:time_start', date.millis())
.set('system:index', date.format('YYYY-MM-dd'));
});
}).flatten()
);
// 6. 计算整体平均
var ave = methane_monthly.mean();
// 7. 计算异常
var anomaly = methane_monthly.map(function(img) {
return img.subtract(ave).rename('anomaly')
.copyProperties(img, img.propertyNames());
});
// ---------------------- 可视化部分 ----------------------
// A) 时间序列折线图(甲烷浓度)
var chart1 = ui.Chart.image.series({
imageCollection: methane_monthly,
region: roi,
reducer: ee.Reducer.mean(),
scale: 7000,
xProperty: 'system:time_start'
}).setOptions({
title: 'Monthly Mean CH4 in ' + regionName,
vAxis: {title: 'Methane (ppbv)'},
hAxis: {title: 'Date'}
});
print(chart1);
// B) 时间序列柱状图(异常值)
var chart2 = ui.Chart.image.series({
imageCollection: anomaly,
region: roi,
reducer: ee.Reducer.mean(),
scale: 7000,
xProperty: 'system:time_start'
}).setChartType('ColumnChart')
.setOptions({
title: 'CH4 Anomaly in ' + regionName,
vAxis: {title: 'Anomaly (ppbv)'},
hAxis: {title: 'Date'},
colors: ['
#d95f0e
']
});
print(chart2);
// C) 平均浓度空间分布
var vizMean = {
min: 1750,
max: 1900,
palette: ['blue', 'cyan', 'green', 'yellow', 'red']
};
Map.addLayer(ave.clip(roi), vizMean, "Mean CH4 (2020–2023)");
// D) 某个月份的空间分布(例如 2021-01)
var oneMonth = methane_monthly.filterDate('2021-01-01', '2021-02-01').first();
Map.addLayer(oneMonth.clip(roi), vizMean, "CH4 Example (Jan 2021)");
// E) 趋势分析(Kendall’s τ)
var trend = methane_monthly.reduce(ee.Reducer.kendallsCorrelation());
Map.addLayer(trend.select('methane_tau').clip(roi),
{min: -0.5, max: 0.5, palette: ['blue','white','red']},
'CH4 Trend');
// ---------------------- 数据导出 ----------------------
// 导出时间序列为 CSV
var tsTable = ee.FeatureCollection(methane_monthly.map(function(img) {
var meanVal = img.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 7000
}).get('methane');
return ee.Feature(null, {
date: ee.Date(img.get('system:time_start')).format('YYYY-MM-dd'),
methane: meanVal,
region: regionName
});
}));
Export.table.toDrive({
collection: tsTable,
description: 'CH4_TimeSeries_' + regionName,
fileFormat: 'CSV',
folder: 'CH4_China'
});