如何在Geopandas中执行带日期条件的空间连接操作?
同时基于空间坐标与日期列连接两个DataFrame
问题描述
现有两个包含Lat(纬度)、Long(经度)及其他附加列的DataFrame,需要在匹配dt日期列的基础上,完成空间坐标的匹配连接,得到合并后的目标结果。
示例数据
import pandas as pd import geopandas as gpd df1 = pd.DataFrame({ 'id': [0, 1, 2], 'dt': ['01-01-2022', '02-01-2022', '03-01-2022'], 'Lat': [33.155480, 33.155480, 33.155480], 'Long': [-96.731630, -96.731630, -96.731630] }) df2 = pd.DataFrame({ 'val': ['a', 'b', 'c'], 'dt': ['01-01-2022', '02-01-2022', '03-01-2022'], 'Lat': [33.155480, 33.155480, 33.155480], 'Long': [-96.731630, -96.731630, -96.731630] })
解决方案
根据场景需求,提供两种实现方式:
1. 精确匹配日期与坐标(适用于坐标完全一致的场景)
如果两个DataFrame的Lat、Long是完全相等的精确值,直接用Pandas的merge方法,同时指定dt、Lat、Long作为连接键即可:
# 执行连接操作 merged_df = pd.merge(df1, df2, on=['dt', 'Lat', 'Long'], how='inner') # 调整列顺序并重命名坐标列以匹配预期输出 merged_df = merged_df[['id', 'dt', 'Lat', 'Long', 'val']].rename(columns={'Lat': 'lat', 'Long': 'long'}) # 打印结果 print(merged_df)
输出结果:
id dt lat long val 0 0 01-01-2022 33.155480 -96.731630 a 1 1 02-01-2022 33.155480 -96.731630 b 2 2 03-01-2022 33.155480 -96.731630 c
2. 空间邻近匹配+日期匹配(适用于坐标不完全一致的场景)
如果需要基于空间邻近关系(比如点在一定距离范围内)同时匹配日期,使用GeoPandas的空间连接功能,先按日期分组再执行空间连接:
# 将普通DataFrame转换为GeoDataFrame gdf1 = gpd.GeoDataFrame(df1, geometry=gpd.points_from_xy(df1.Long, df1.Lat)) gdf2 = gpd.GeoDataFrame(df2, geometry=gpd.points_from_xy(df2.Long, df2.Lat)) # 按日期分组后执行空间连接(可根据需求更换predicate参数,如within、distance等) merged_gdf = pd.concat([ gpd.sjoin(gdf1[gdf1['dt'] == dt], gdf2[gdf2['dt'] == dt], how='inner', predicate='intersects') for dt in gdf1['dt'].unique() ]) # 整理列格式并重置索引 merged_gdf = merged_gdf[['id', 'dt', 'Lat', 'Long', 'val']].rename(columns={'Lat': 'lat', 'Long': 'long'}).reset_index(drop=True) # 打印结果 print(merged_gdf)
说明
- 方法1操作简单、效率高,适合坐标和日期完全匹配的场景;
- 方法2支持空间邻近匹配,灵活性更强,适合坐标存在微小误差或需要范围匹配的场景。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

