如何在Python的GeoPandas中按时间与几何关联两个GeoDataFrame?
同时按空间与时间关联两个GeoDataFrame的方法
针对你的需求,核心思路是先完成空间匹配,再叠加时间条件过滤,或根据时间关联的具体逻辑(区间包含/最近时间匹配)调整顺序,以下是具体实现方案:
前提准备
首先确保两个GeoDataFrame的时间列都是datetime类型,避免时间比较出错:
import geopandas as gpd import pandas as pd # 转换时间列为datetime格式(根据你的实际列名修改) df_a['start_time'] = pd.to_datetime(df_a['start_time']) df_a['end_time'] = pd.to_datetime(df_a['end_time']) # 若df_a是时间区间数据 # 若df_a是单个时间点数据:df_a['a_time'] = pd.to_datetime(df_a['a_time']) df_b['point_time'] = pd.to_datetime(df_b['point_time'])
方案1:时间区间匹配(df_a为时间段多边形)
如果df_a的每条记录对应一个时间区间(比如某时段内的区域数据),需要将df_b的点匹配到「空间包含该点,且时间区间覆盖该点时间」的多边形:
- 执行左空间连接(因所有点都在多边形内,用
contains比intersects更精准):
# 左连接保留所有df_a的多边形,即使无对应点 spatial_joined = gpd.sjoin(df_a, df_b, how='left', predicate='contains')
- 过滤时间符合条件的记录:
# 筛选点时间落在多边形时间区间内的记录 final_df = spatial_joined[ (spatial_joined['point_time'] >= spatial_joined['start_time']) & (spatial_joined['point_time'] <= spatial_joined['end_time']) ]
方案2:最近时间点匹配(df_a为离散时间点多边形)
如果df_a的每条记录对应单个时间点的多边形(比如不同时间快照的区域),需要将df_b的点匹配到「空间包含该点,且时间最接近」的多边形:
- 执行左空间连接:
spatial_joined = gpd.sjoin(df_a, df_b, how='left', predicate='contains')
- 计算时间差并筛选最近匹配:
# 计算时间差的绝对值(假设df_a的时间列是a_time,df_b是point_time) spatial_joined['time_diff'] = abs(spatial_joined['a_time'] - spatial_joined['point_time']) # 按df_a的唯一标识(比如polygon_id)分组,保留每组中时间差最小的记录 final_df = spatial_joined.sort_values(['polygon_id', 'time_diff']) \ .groupby('polygon_id') \ .first() \ .reset_index()
注意事项
- 若需要严格时间匹配(点时间=多边形时间),可在空间连接后直接过滤
spatial_joined['a_time'] == spatial_joined['point_time'] - 左连接会保留所有df_a的多边形,无对应点的记录中来自df_b的字段会显示为
NaN,符合你的需求
内容的提问来源于stack exchange,提问作者gabe
相关产品推荐
相关产品推荐

