10分钟掌握CNEnvAir环境空气质量数据读取Python实用代码示例【免费下载链接】CNEnvAir项目地址: https://ai.gitcode.com/GewisLab/CNEnvAir想要快速上手中国环境空气质量数据读取吗GewisLab/CNEnvAir数据集为您提供了完整的环境空气污染数据解决方案包含高分辨率空气质量网格数据、城市监测数据和气象再分析数据。无论您是环境科学研究者、数据分析师还是GIS专业人士这篇快速指南将帮助您在10分钟内掌握CNEnvAir数据读取的核心技巧 CNEnvAir数据集概览CNEnvAir是中国环境空气数据集专门为少样本空气污染源解析研究设计。数据集包含四大核心模块数据集数据格式时间范围主要用途CHAP高分辨率空气质量数据NetCDF (.nc)2019-2024全国范围污染物浓度网格分析CN-air城市监测数据Parquet (.parquet)2019-2024城市级空气质量趋势分析源成分谱数据Parquet (.parquet)-污染源解析模型输入ERA5-GEE气象数据GeoTIFF (.tif)2019-2024气象条件与污染关联分析 环境准备与快速安装一键克隆数据集仓库git clone https://gitcode.com/GewisLab/CNEnvAir.git cd CNEnvAirPython依赖库安装pip install xarray pandas rasterio netCDF4 pyarrow 四种数据格式的读取方法方法一CHAP NetCDF数据读取CHAP数据集提供0.01°高分辨率空气质量月均值数据包含PM2.5、PM10、CO、SO₂、NO₂、O₃六种污染物。import xarray as xr # 读取PM2.5数据 ds xr.open_dataset(CHAP/CHAP_PM25_NC/CHAP_PM2.5_M1K_201901_V4.nc) pm25_data ds[PM2.5].values print(f数据维度: {pm25_data.shape}) print(f经度范围: {ds.lon.values.min():.2f} - {ds.lon.values.max():.2f}°E) print(f纬度范围: {ds.lat.values.min():.2f} - {ds.lat.values.max():.2f}°N)关键参数说明lat: 3571个纬度点 (17.97°N - 53.67°N)lon: 6148个经度点 (73.46°E - 134.93°E)数据单位: μg/m³方法二CN-air Parquet数据读取城市空气质量监测数据采用Parquet列式存储压缩率高读取速度快。import pandas as pd # 读取2019年城市空气质量数据 df pd.read_parquet(CN-air/城市_20190101-20191231.parquet) print(f数据行数: {len(df)}) print(f数据列数: {len(df.columns)}) print(\n前5行数据预览:) print(df.head()) # 查看数据结构 print(\n数据列信息:) for col in df.columns: print(f - {col})数据字段包含城市、日期、AQI、PM2.5、PM10、SO₂、NO₂、CO、O₃等关键指标。方法三源成分谱数据读取源成分谱数据用于PMF/CMB等源解析模型包含工业燃烧、民用燃烧、移动源等多种污染源类型。import pandas as pd # 读取工业锅炉PM源谱数据 profile_df pd.read_parquet(source_profiles/PM_source_Industrial_boiler.parquet) print(源成分谱数据结构:) print(profile_df.info()) # 查看污染物组分 print(\n污染物组分示例:) print(profile_df[组分].unique()[:10])方法四ERA5气象数据读取气象再分析数据采用GeoTIFF格式便于GIS分析和空间可视化。import rasterio import numpy as np # 读取2019年1月气象数据 with rasterio.open(era5_gee/era5_201901.tif) as src: # 读取所有波段数据 data src.read() # 获取元数据 print(f数据形状: {data.shape}) print(f坐标系: {src.crs}) print(f空间范围: {src.bounds}) print(f分辨率: {src.res}) # 获取各个波段信息气温、露点温度、风速等 for i in range(1, src.count 1): band_data src.read(i) print(f波段{i} - 最小值: {band_data.min():.2f}, 最大值: {band_data.max():.2f}) 实用数据处理技巧技巧一批量读取多个月份数据import glob import xarray as xr # 批量读取2020年所有月份的PM2.5数据 pm25_files glob.glob(CHAP/CHAP_PM25_NC/CHAP_PM2.5_M1K_2020*.nc) datasets [xr.open_dataset(f) for f in sorted(pm25_files)] combined_ds xr.concat(datasets, dimtime) print(f合并后数据时间维度: {len(combined_ds.time)}个月)技巧二数据筛选与子集提取# 提取特定城市数据 beijing_data df[df[城市] 北京市] print(f北京市数据记录数: {len(beijing_data)}) # 提取特定时间段数据 spring_2020 df[(df[日期] 2020-03-01) (df[日期] 2020-05-31)] print(f2020年春季数据记录数: {len(spring_2020)})技巧三空间区域数据提取# 提取京津冀地区数据 jjj_cities [北京市, 天津市, 石家庄市, 唐山市, 秦皇岛市] jjj_data df[df[城市].isin(jjj_cities)] print(f京津冀地区数据记录数: {len(jjj_data)}) # 按城市分组统计 city_stats jjj_data.groupby(城市)[PM2.5].agg([mean, max, min]) print(\n京津冀城市PM2.5统计:) print(city_stats) 数据质量控制建议1. 缺失值处理# 检查数据完整性 missing_percent df.isnull().sum() / len(df) * 100 print(各字段缺失值比例:) print(missing_percent[missing_percent 0]) # 填充或删除缺失值 df_clean df.dropna(subset[PM2.5, AQI]) # 删除关键指标缺失的行2. 异常值检测# 检测PM2.5异常值通常500μg/m³为异常 pm25_outliers df[df[PM2.5] 500] print(fPM2.5异常值数量: {len(pm25_outliers)}) # 检测负值物理上不可能 negative_values df[df[PM2.5] 0] print(fPM2.5负值数量: {len(negative_values)})3. 数据一致性验证# 验证时间序列连续性 df[日期] pd.to_datetime(df[日期]) date_range pd.date_range(startdf[日期].min(), enddf[日期].max(), freqD) missing_dates date_range.difference(df[日期]) print(f缺失日期数量: {len(missing_dates)}) 高级应用场景场景一污染源解析研究# 结合源成分谱进行源解析 import pandas as pd # 读取多种源成分谱 industrial_sources pd.read_parquet(source_profiles/工业燃烧源/*.parquet) vehicle_sources pd.read_parquet(source_profiles/道路移动源/*.parquet) residential_sources pd.read_parquet(source_profiles/民用燃烧源/*.parquet) print(可用于源解析的污染源类型:) print(f- 工业燃烧源: {len(industrial_sources)}个样本) print(f- 道路移动源: {len(vehicle_sources)}个样本) print(f- 民用燃烧源: {len(residential_sources)}个样本)场景二气象-污染关联分析# 结合气象数据与空气质量数据 import xarray as xr import pandas as pd # 读取同期气象数据 weather_ds xr.open_dataset(era5_gee/era5_201901.tif) air_quality_ds xr.open_dataset(CHAP/CHAP_PM25_NC/CHAP_PM2.5_M1K_201901_V4.nc) print(气象与空气质量数据空间对齐:) print(f气象数据分辨率: {weather_ds.res}) print(f空气质量数据分辨率: {air_quality_ds.res}) 数据读取最佳实践1. 内存优化技巧# 使用分块读取大文件 chunk_size 100000 # 每次读取10万行 chunks pd.read_parquet(CN-air/城市_20190101-20191231.parquet, chunksizechunk_size) for chunk in chunks: # 处理每个数据块 process_chunk(chunk)2. 数据缓存策略import joblib from functools import lru_cache lru_cache(maxsize10) def load_cached_data(file_path): 缓存最近加载的10个数据文件 if file_path.endswith(.nc): return xr.open_dataset(file_path) elif file_path.endswith(.parquet): return pd.read_parquet(file_path) else: raise ValueError(f不支持的文件格式: {file_path})3. 并行读取加速from concurrent.futures import ThreadPoolExecutor import glob def read_single_file(file_path): if file_path.endswith(.nc): return xr.open_dataset(file_path) elif file_path.endswith(.parquet): return pd.read_parquet(file_path) # 并行读取多个文件 file_list glob.glob(CHAP/CHAP_PM25_NC/CHAP_PM2.5_M1K_2020*.nc) with ThreadPoolExecutor(max_workers4) as executor: results list(executor.map(read_single_file, file_list)) 常见问题与解决方案Q1: 内存不足如何处理大型NetCDF文件解决方案: 使用xarray的分块读取功能# 仅读取数据子集 ds xr.open_dataset(large_file.nc, chunks{lat: 100, lon: 100}) subset ds.sel(latslice(30, 40), lonslice(110, 120))Q2: Parquet文件读取速度慢怎么办解决方案: 指定需要的列避免读取全部数据# 只读取需要的列 columns [城市, 日期, PM2.5, AQI] df pd.read_parquet(CN-air/城市_20190101-20191231.parquet, columnscolumns)Q3: 如何验证数据完整性解决方案: 使用数据校验函数def validate_data_quality(df): 验证数据质量 checks { 总行数: len(df), 缺失值比例: df.isnull().mean().mean(), 重复行数: df.duplicated().sum(), 日期范围: (df[日期].min(), df[日期].max()) } return checks 总结与下一步通过本文的10分钟快速指南您已经掌握了CNEnvAir环境空气质量数据集的四种核心数据读取方法。从NetCDF网格数据到Parquet表格数据从GeoTIFF气象数据到源成分谱数据您现在可以✅快速上手掌握四种数据格式的基本读取方法✅高效处理学会批量读取、筛选和验证数据✅实战应用了解污染源解析和气象关联分析场景✅优化性能应用内存优化和并行读取技巧下一步建议探索数据可视化将读取的数据转换为地图或时间序列图表进行统计分析计算污染物时空分布特征构建预测模型基于历史数据训练空气质量预测模型参与开源贡献向CNEnvAir项目提交数据质量改进建议记住数据读取只是环境数据分析的第一步。掌握了这些基础技能后您可以进一步探索数据背后的环境科学故事温馨提示: 使用CNEnvAir数据集时请务必遵守数据使用协议并在研究成果中正确引用数据来源。【免费下载链接】CNEnvAir项目地址: https://ai.gitcode.com/GewisLab/CNEnvAir创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考