You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的点匹配到「空间包含该点,且时间区间覆盖该点时间」的多边形:

  1. 执行左空间连接(因所有点都在多边形内,用contains比intersects更精准):
# 左连接保留所有df_a的多边形,即使无对应点
spatial_joined = gpd.sjoin(df_a, df_b, how='left', predicate='contains')
  1. 过滤时间符合条件的记录:
# 筛选点时间落在多边形时间区间内的记录
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的点匹配到「空间包含该点,且时间最接近」的多边形:

  1. 执行左空间连接:
spatial_joined = gpd.sjoin(df_a, df_b, how='left', predicate='contains')
  1. 计算时间差并筛选最近匹配:
# 计算时间差的绝对值(假设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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:54:19