基于时间戳合并不同时间间隔的GPS与NO2浓度DataFrame
Hey there! 这个时间序列合并的需求很常见,用pandas就能轻松解决,我给你分几种实用的场景来拆解,你可以根据自己的分析目标来选:
先做准备工作:确保索引是标准datetime类型
不管用哪种方法,第一步得把两个DataFrame的时间索引转换成pandas可识别的datetime类型,而且要排序(很多时间序列操作要求有序索引):
import pandas as pd # 转换并排序GPS数据的索引 df_gps.index = pd.to_datetime(df_gps.index) df_gps = df_gps.sort_index() # 转换并排序NO2数据的索引 df_no2.index = pd.to_datetime(df_no2.index) df_no2 = df_no2.sort_index()
场景1:保留NO2的高频数据,匹配最近的GPS坐标
如果你的需求是每一条NO2数据都对应一个GPS位置(比如要绘制每个NO2采样点的空间分布),用merge_asof绝对是最佳选择——它专门用来处理异步时间序列的合并,能给每个NO2的时间点匹配最近的GPS数据:
# 匹配每个NO2时间点之前最近的GPS数据(direction='backward') merged_df = pd.merge_asof( df_no2, df_gps, left_index=True, right_index=True, direction='backward' ) # 可选:如果你想匹配之后最近的GPS数据,把direction改成'forward' # 或者想匹配距离最近的(不管前后),用direction='nearest'
这种方式不会丢失任何NO2的高频数据,每个采样点都能拿到对应的GPS坐标,非常适合时空关联分析。
场景2:将NO2聚合到GPS的3秒时间间隔上
如果你的分析更关注GPS的时间节点(比如想看每个GPS位置对应的NO2平均浓度),那就把高频的NO2数据聚合到GPS的3秒间隔上:
# 方法1:直接重采样NO2到3秒间隔,用均值聚合(也可以用first/last/max等) df_no2_resampled = df_no2.resample('3S').mean() # 合并GPS和重采样后的NO2,丢弃无匹配的行 merged_df = pd.concat([df_gps, df_no2_resampled], axis=1).dropna() # 方法2:按GPS的时间点分组,聚合每个时间窗口内的NO2数据 # 适合GPS间隔不是严格3秒的情况 merged_df = df_no2.groupby(pd.cut(df_no2.index, bins=df_gps.index)).mean() # 把分组后的区间索引换成GPS的时间点 merged_df.index = df_gps.index[:-1]
这种方式得到的最终数据和GPS的时间间隔完全一致,方便按GPS位置做浓度分析。
一些关键注意事项
- 一定要确保索引是排序后的datetime类型:
merge_asof和重采样操作都依赖有序的时间索引,否则会报错或得到错误结果。 - 缺失值处理:合并后可能会有少量缺失值(比如GPS时间范围外的NO2数据),可以用
merged_df.fillna(method='ffill')向前填充,或者根据业务逻辑选择填充方式。 - 选择哪种合并方式,核心看你的分析目标:要保留高频细节选场景1,要对齐GPS时间粒度选场景2。
内容的提问来源于stack exchange,提问作者jspaeth
相关产品推荐
相关产品推荐

