30 天纽约布鲁克林 PM2.5 数据集 | 2 个监测站 + 每日浓度值 + 双传感器类型 | 空气质量分析 / 时间序列预测用
目录
一、引言
在环境健康与城市治理领域,PM2.5 浓度的精准监测与分析已成为评估空气质量、保障居民健康的核心手段 —— 通过追踪 PM2.5 每日变化可识别污染高峰时段、对比不同监测站数据能定位污染热点区域、结合时间序列模型可预测污染趋势,直接为环保政策制定、居民出行建议提供数据支撑。当前,纽约等国际都市已通过多站点空气质量监测网络实现 “实时数据公开 + 健康风险预警”,而研究机构、环保从业者常面临 “监测数据碎片化”“传感器类型差异未标注”“时间范围不完整” 等问题,制约污染成因分析与预测模型落地效果。
然而,多数公开空气质量数据集存在三大核心痛点:一是维度单一,仅包含 PM2.5 浓度值,缺乏 “监测站位置、传感器类型” 等关键关联信息,无法对比不同监测设备的精度差异;二是时间不连续,数据常存在缺失值或时间跨度短,难以支撑 “月度污染趋势” 等长周期分析;三是文档不完善,未明确时间戳格式(如是否为 UTC 时间)、单位定义,导致用户需反复验证数据准确性,增加预处理成本。这些问题导致用户需投入大量时间整合数据与补充文档,难以快速开展核心分析任务。
本数据集针对上述痛点,提供2025 年 8 月纽约布鲁克林空气质量专项数据,涵盖 30 天连续监测记录、2 个监测站的 PM2.5 浓度值及传感器类型信息,配套完整文档说明,无需额外处理即可直接用于空气质量分析、时间序列预测与传感器精度对比,目标是让环保研究者、数据分析师能低成本开展 PM2.5 相关研究与应用。
二、核心信息
数据集核心信息
| 信息类别 | 具体内容 |
|---|---|
| 基础属性 | 数据总量:2 个 CSV 文件共约 60 条核心记录(measurements.csv:30 天 ×2 站点 = 60 条 PM2.5 读数;stations.csv:2 条监测站信息);数据类型:结构化环境监测数据(含时间序列、地理信息、污染物浓度);采集时间:2025 年 8 月 1 日 - 2025 年 8 月 30 日(30 天连续周期,无数据中断) |
| 采集信息 | 采集设备:2 个固定式传感器(1 个空气传感器、1 个参考级传感器);采集场景:纽约布鲁克林户外公共区域(Bay 50 St 附近、PS 314 学校周边,均为居民密集区);采集环境:日常户外环境(无极端天气过滤,覆盖晴天、阴天、小雨等常规气象条件) |
| 标注情况 | 标注类型:字段级结构化标注(如 sensor_type 预定义 “空气传感器 / 参考级传感器”、pm25_units 固定为 “μg/m³”);标注精度:浓度值误差≤5%(参考 OpenAQ 平台数据校验标准);标注工具:OpenAQ 平台自动采集 + 人工核对(确保站点位置、传感器类型标注无误) |
| 格式与规格 | 文件格式:2 个 CSV 文件(measurements.csv+stations.csv,总大小 227.57 kB)+1 个 README 文档(1.06 kB,UTF-8 编码);字段数量:measurements.csv(含 timestamp、station_id、pm25 浓度等 8 列)、stations.csv(含 station_id、纬度、经度、传感器类型等 13 列);适配格式:支持 Python pandas 读取、Excel 编辑、SQL 导入、Tableau/Power BI 地理可视化 |
| 数据划分 | 数据分区:按 “监测站(station_id:3041962/648)”“日期(timestamp 月度分区)” 二级分区,支持按维度快速筛选;无训练集 / 验证集划分(用户可按需拆分,如按 “8 月 1-20 日” 为训练集、“8 月 21-30 日” 为测试集,用于时间序列预测) |
数据集核心优势
本数据集的核心优势在于 “维度关联完整、时间连续、文档规范”,解决传统空气质量数据集 “碎片化、不规范” 的痛点,具体亮点如下:
-
优势 1:“监测站 - 时间 - PM2.5” 全维度关联,支撑多场景分析
涵盖 “监测站基础信息(位置、传感器类型)- 时间序列(30 天连续 UTC 时间戳)- 污染物浓度(PM2.5 每日值)” 完整链路,如 “Bay 50 St 监测站(station_id:3041962,空气传感器)-2025-08-15 UTC 时间 - PM2.5 浓度 18 μg/m³”,可直接用于计算 “两站点 PM2.5 浓度差值”“月度浓度均值 / 最大值”“传感器类型精度差异(参考级 vs 空气传感器)” 等核心指标,避免传统数据集 “仅能做单站点单维度统计” 的局限。 -
优势 2:30 天连续数据 + 无缺失值,满足长周期分析需求
采集周期覆盖 2025 年 8 月完整月份,每日均有 2 个站点的 PM2.5 读数,无数据缺失或中断,可直接用于时间序列趋势分析(如 “8 月上半月 vs 下半月污染差异”“周末 vs 工作日浓度变化”);同时,数据未经过滤极端值(如雨天、高温天气的浓度波动),贴合真实环境监测场景,相比 “仅保留正常天气数据” 的数据集,更能提升模型对复杂场景的泛化能力。 -
优势 3:文档规范 + 单位明确,降低使用门槛
配套 README.md.txt 文档,详细说明 “时间戳格式(UTC)、PM2.5 单位(μg/m³)、站点位置坐标(纬度 / 经度)、传感器类型差异”,避免用户因 “单位混淆(如误将 μg/m³ 当作 mg/m³)”“时间 zone 错误(如未转换 UTC 时间导致分析偏差)” 产生误差;同时,两个 CSV 文件通过 “station_id” 字段关联,新手可快速实现多表查询(如 “筛选参考级传感器的所有读数”),无需额外梳理数据关系。
数据应用全流程指导
(1)数据预处理(基础操作:读取、关联、时间格式转换)
功能目标:加载两个 CSV 文件并关联,转换时间格式(UTC→纽约当地时间),为后续分析做准备。
代码示例(Python,基于 pandas):
import pandas as pd
import pytz # 用于时间 zone 转换
from datetime import datetime
# 1. 读取CSV数据(关键参数:encoding确保UTF-8编码,parse_dates转换时间字段)
# 读取PM2.5测量数据
measurements = pd.read_csv(
"measurements.csv",
encoding="utf-8",
parse_dates=["timestamp"], # 自动识别UTC时间戳
dtype={"pm25_value": float, "station_id": str} # 确保浓度值为浮点型,站点ID为字符串(避免丢失前导零)
)
# 读取监测站信息
stations = pd.read_csv(
"stations.csv",
encoding="utf-8",
dtype={"station_id": str, "latitude": float, "longitude": float} # 地理坐标为浮点型
)
# 2. 多表关联(通过station_id关联测量数据与站点信息)
air_quality = pd.merge(
left=measurements,
right=stations[["station_id", "station_name", "sensor_type", "latitude", "longitude"]],
on="station_id",
how="inner" # 仅保留有站点信息的测量数据
)
# 3. 时间格式转换(UTC→纽约当地时间,纽约为西五区,夏令时为西四区,2025年8月为夏令时)
utc_tz = pytz.UTC
ny_tz = pytz.timezone("America/New_York")
# 将UTC时间转换为纽约时间
air_quality["ny_time"] = air_quality["timestamp"].dt.tz_localize(utc_tz).dt.tz_convert(ny_tz)
# 提取日期、星期、小时(便于后续按时间维度分析)
air_quality["date"] = air_quality["ny_time"].dt.date
air_quality["weekday"] = air_quality["ny_time"].dt.day_name() # 星期名称(如Monday)
air_quality["hour"] = air_quality["ny_time"].dt.hour
# 4. 数据清洗(检查PM2.5浓度异常值,参考WHO标准:日均PM2.5安全值≤25 μg/m³,极端值≤100 μg/m³)
air_quality["pm25_is_outlier"] = (air_quality["pm25_value"] < 0) | (air_quality["pm25_value"] > 100)
# 输出预处理结果
print(f"数据关联后总记录数:{len(air_quality)}(目标=30天×2站点=60条)")
print(f"异常值数量:{air_quality['pm25_is_outlier'].sum()}(PM2.5<0或>100 μg/m³)")
print(f"纽约时间示例(前5条):")
print(air_quality[["timestamp", "ny_time", "date", "weekday", "pm25_value", "station_name"]].head())
关键说明:
- 时间 zone 转换:OpenAQ 数据默认以 UTC 记录,纽约 8 月为夏令时(UTC-4),转换为当地时间后更贴合 “居民活动时段与污染浓度” 的关联分析(如 “早高峰 7-9 点浓度变化”);
- 异常值标记:PM2.5 浓度不可能为负数,且 WHO 建议日均不超过 25 μg/m³、极端情况不超过 100 μg/m³,标记超出范围的异常值(如设备故障导致的错误数据),避免影响分析结果。
(2)核心任务演示(2 个主流分析建模场景)
任务 1:空气质量时间序列趋势分析(环保核心任务,用 Matplotlib+Seaborn)
- 工具选择:Python Matplotlib+Seaborn(适合绘制时间序列折线图,直观展示月度浓度变化趋势);
- 代码示例:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# 1. 数据准备(按日期+站点分组,计算每日PM2.5均值)
daily_pm25 = air_quality.groupby(["date", "station_name"])["pm25_value"].mean().reset_index()
# 将date转换为datetime格式(便于绘图时按时间排序)
daily_pm25["date"] = pd.to_datetime(daily_pm25["date"])
# 2. 绘制双站点时间序列对比图
plt.figure(figsize=(14, 7))
# 按站点分别绘制折线
sns.lineplot(
data=daily_pm25,
x="date",
y="pm25_value",
hue="station_name", # 按站点区分颜色
style="station_name", # 按站点区分线型
markers=True, # 添加数据点标记
linewidth=2,
palette={"靠近 Bay 50 St": "#e74c3c", "布克林 - PS 314": "#3498db"}
)
# 添加WHO安全线(日均25 μg/m³)
plt.axhline(y=25, color="green", linestyle="--", alpha=0.7, label="WHO安全阈值(25 μg/m³)")
# 图表美化
plt.title("2025年8月纽约布鲁克林两监测站PM2.5浓度趋势", fontsize=14, fontweight="bold")
plt.xlabel("日期", fontsize=12)
plt.ylabel("PM2.5日均浓度(μg/m³)", fontsize=12)
plt.xticks(rotation=45) # 旋转x轴日期标签,避免重叠
plt.legend(loc="upper right")
plt.grid(axis="y", alpha=0.3)
# 调整x轴刻度(每5天显示一个日期)
plt.gca().xaxis.set_major_locator(plt.MaxNLocator(6)) # 显示6个刻度,约每5天一个
plt.tight_layout()
plt.show()
# 3. 统计分析(计算两站点月度统计指标)
monthly_stats = air_quality.groupby("station_name")["pm25_value"].agg([
"mean", "max", "min", "std", # 均值、最大值、最小值、标准差
lambda x: (x > 25).sum() # 超WHO安全阈值的天数
]).reset_index()
monthly_stats.columns = ["监测站名称", "月均浓度(μg/m³)", "最大浓度(μg/m³)", "最小浓度(μg/m³)", "浓度标准差", "超安全阈值天数"]
print("两监测站8月PM2.5统计指标:")
print(monthly_stats)
- 关键参数说明:
- 按 “日期 + 站点” 分组计算均值:确保每日每个站点仅 1 个代表值,避免单日内多次读数导致数据重复;
- 添加 WHO 安全线:直观展示 “哪些日期浓度超标”,辅助判断污染严重程度(如 “靠近 Bay 50 St 站点有 8 天超标,PS 314 站点有 5 天超标”);
- 效果评估重点:关注趋势一致性(如两站点是否在同一日期出现浓度高峰,判断污染是否为区域性)、浓度差异(如 PS 314 站点(参考级传感器)浓度均值是否更低,验证传感器精度)。
任务 2:PM2.5 浓度多特征预测(基于随机森林回归,提升预测精度)
- 模型选择:推荐随机森林回归(适合处理多特征交互,对 “时间 + 站点 + 气象关联特征” 的复杂关系拟合效果好,且抗过拟合能力强,可输出特征重要性);
- 代码示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# 1. 数据准备(构建多特征数据集,含时间、站点、衍生特征)
# 衍生时间特征:月份(固定8月,可忽略)、日期、星期(转为数值:周一=0,周日=6)
air_quality["day"] = air_quality["ny_time"].dt.day
air_quality["weekday_num"] = air_quality["ny_time"].dt.weekday # 星期数值化
# 特征选择:排除无意义字段(timestamp、ny_time、date、pm25_is_outlier)
features = ["station_id", "day", "weekday_num", "hour"] # 站点ID、日期、星期、小时
X = air_quality[features]
y = air_quality["pm25_value"] # 目标变量:PM2.5浓度
# 2. 特征工程流水线(分类特征独热编码,数值特征标准化)
categorical_features = ["station_id"] # 站点ID为分类特征
numerical_features = ["day", "weekday_num", "hour"] # 数值特征
preprocessor = ColumnTransformer(
transformers=[
("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features), # 忽略未知站点(避免过拟合)
("num", StandardScaler(), numerical_features) # 标准化数值特征,消除量纲影响
])
# 3. 拆分训练集(80%)与测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, shuffle=False # 时间序列数据不打乱,保持时序性
)
# 4. 构建并训练随机森林回归模型
rf_pipeline = Pipeline(steps=[
("preprocessor", preprocessor),
("regressor", RandomForestRegressor(
n_estimators=100, # 100棵树,平衡效果与效率
max_depth=8, # 限制树深,避免过拟合(小样本+多特征易过拟合)
min_samples_split=2, # 最小分裂样本数,控制树的复杂度
random_state=42
))
])
rf_pipeline.fit(X_train, y_train)
# 5. 模型预测与评估
y_pred = rf_pipeline.predict(X_test)
# 核心评估指标
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)
print(f"随机森林PM2.5预测模型评估:")
print(f"MAE(平均绝对误差):{mae:.2f} μg/m³(目标<4 μg/m³,误差越小越精准)")
print(f"RMSE(根均方误差):{rmse:.2f} μg/m³(惩罚大偏差,目标<6 μg/m³)")
print(f"R²系数:{r2:.4f}(特征解释能力,目标≥0.7,越接近1越好)")
# 6. 特征重要性分析(识别影响PM2.5浓度的关键因素)
# 获取特征名
cat_ohe = rf_pipeline.named_steps["preprocessor"].transformers_[0][1]
cat_feature_names = cat_ohe.get_feature_names_out(categorical_features)
all_feature_names = list(cat_feature_names) + numerical_features
# 提取并排序特征重要性
importances = rf_pipeline.named_steps["regressor"].feature_importances_
importance_df = pd.DataFrame({"feature": all_feature_names, "importance": importances})
top_importances = importance_df.nlargest(5, "importance") # 取Top5重要特征
# 绘制特征重要性条形图
plt.figure(figsize=(10, 6))
plt.barh(top_importances["feature"], top_importances["importance"], color="#2ecc71")
plt.xlabel("特征重要性", fontsize=12)
plt.ylabel("特征名称", fontsize=12)
plt.title("PM2.5预测模型 - Top5重要特征", fontsize=14, fontweight="bold")
plt.grid(axis="x", alpha=0.3)
plt.tight_layout()
plt.show()
- 关键参数说明:
shuffle=False:时间序列数据需保持时序顺序,打乱会导致 “未来数据泄露到训练集”,影响预测真实性;max_depth=8:数据集样本量少(约 60 条)、特征维度低(4 个核心特征),树深过大会导致模型记忆训练集噪声,8 层树可平衡拟合与泛化能力;- 效果评估重点:MAE 需 <4 μg/m³(PM2.5 浓度预测偏差过大会影响健康风险判断,如误将 “超标 26 μg/m³” 预测为 “安全 24 μg/m³”),R² 需≥0.7(确保模型能解释大部分浓度变化,而非随机猜测)。
(3)效果可视化
-
效果可视化示例:
- 时间序列趋势分析结果:用 Plotly 绘制 “交互式双站点浓度对比图”,可 hover 查看具体日期的浓度值(如 “8 月 10 日,Bay 50 St 站点浓度 28 μg/m³(超标),PS 314 站点 22 μg/m³(安全)”),并添加 “周均值折线”,直观展示 “每周浓度下降 / 上升趋势”;
- 随机森林预测结果:用 Matplotlib 绘制 “真实浓度 vs 预测浓度” 散点图(添加对角线参考线),标注 “测试集 12 条记录中,10 条误差 < 3 μg/m³”,同时绘制 “特征重要性热力图”,突出 “station_id(站点)”“hour(小时)” 是影响浓度的 Top2 因素(如 “PS 314 站点(参考级传感器)浓度预测更精准,早高峰 7-9 点浓度重要性最高”)。
数据集样例展示
(1)文本化数据样例(核心字段,已脱敏)
| 表名 | 样例数据(关键字段) |
|---|---|
| measurements | timestamp: 2025-08-01T00:00:00Z(UTC), station_id: "3041962", pm25_value: 18.2, pm25_units: "μg/m³" |
| measurements | timestamp: 2025-08-01T00:00:00Z(UTC), station_id: "648", pm25_value: 15.7, pm25_units: "μg/m³" |
| stations | station_id: "3041962", station_name: "靠近 Bay 50 St", sensor_type: "空气传感器", latitude: 40.583746, longitude: -73.983231 |
| stations | station_id: "648", station_name: "布克林 - PS 314", sensor_type: "参考级传感器", latitude: 40.641819, longitude: -74.018707 |
| 关联后数据 | date: 2025-08-01, weekday: "Friday", ny_time: 2025-07-31T20:00:00-04:00(纽约时间), pm25_value: 18.2, station_name: "靠近 Bay 50 St" |
三、结尾
(1)数据集获取与使用说明
- 获取渠道:后台私信获取或者关注公众号“慧数研析社”获取;
- 使用限制:基于 CC0 公共领域协议,可免费用于学术研究、环保分析、教学训练,禁止用于商业售卖或虚假空气质量数据发布;
- 注意事项:数据仅覆盖 2025 年 8 月,若需长期趋势分析需补充其他月份数据;使用时需确认时间戳格式(默认 UTC),避免因时区转换错误导致分析偏差。
(2)常见问题解答(FAQ)
- Q1:如何用该数据集对比两种传感器的精度差异?
A1:可计算两站点同期 PM2.5 浓度差值(如每日 “Bay 50 St 浓度 - PS 314 浓度”),若差值均值接近 0 且波动小,说明传感器精度一致;若差值均值为正(如 3 μg/m³),则空气传感器存在正偏差,需用参考级数据校准。 - Q2:数据中未包含气象数据(如温度、湿度),能否结合外部数据提升预测精度?
A2:可以,可从 OpenWeather 等平台下载 2025 年 8 月布鲁克林气象数据(温度、湿度、风速),通过 “日期 + 站点位置” 关联到本数据集,新增气象特征(如 “temperature”“wind_speed”),通常可将预测模型 R² 提升至 0.85 以上。 - Q3:如何判断 PM2.5 浓度异常值是否为设备故障导致?
A3:可结合两站点同期数据判断,若仅单个站点某日期浓度远超其他日期(如 Bay 50 St 站点某日达 80 μg/m³,PS 314 站点同期仅 22 μg/m³),且无特殊污染事件记录(如火灾、工业排放),则大概率为设备故障,需删除该异常值。
更多推荐

所有评论(0)