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

如何使用Geopandas同时基于公共键与空间位置执行sjoin连接

时空双条件空间连接实现方案

基础实现(兼容所有geopandas版本)

写法1:全量空间连接后过滤(适合小数据集)

  • 思路:先执行标准空间匹配,再筛选出左右表hour值相等的结果,代码最简单
import geopandas as gpd

# 执行标准空间连接,同名字段会自动加_left/_right后缀
full_sjoin = gpd.sjoin(gdf_A, gdf_B, how="inner", predicate="intersects")
# 仅保留hour匹配的行
final_result = full_sjoin[full_sjoin["hour_left"] == full_sjoin["hour_right"]]

写法2:按hour分组连接(适合大数据集)

  • 思路:仅对同一hour的子集做空间匹配,避免跨hour的无效计算,性能提升明显
import pandas as pd
import geopandas as gpd

result = []
for hour in gdf_A["hour"].unique():
    a_sub = gdf_A[gdf_A["hour"] == hour]
    b_sub = gdf_B[gdf_B["hour"] == hour]
    if len(a_sub) == 0 or len(b_sub) == 0:
        continue
    # 单小时子集空间连接
    sub_sjoin = gpd.sjoin(a_sub, b_sub, how="inner", predicate="intersects")
    result.append(sub_sjoin)

# 合并所有小时的结果
final_result = gpd.GeoDataFrame(pd.concat(result, ignore_index=True))

简化实现(geopandas ≥ 0.14.0版本)

geopandas 0.14及以上版本的sjoin接口已经原生支持非空间关联键参数on,可以直接指定hour作为额外匹配条件,底层已做优化,性能和代码简洁度都最优:

final_result = gpd.sjoin(
    gdf_A, 
    gdf_B, 
    how="inner", 
    predicate="intersects",
    on="hour" # 额外要求两表的hour字段值相等才匹配
)

内容的提问来源于stack exchange,提问作者John s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:45:06