我必须使用数据帧-df
和gdf
from datetime import datetime
import pandas as pd
data = [['foo', datetime(2020,1,1,0,0,0) ], ['foo', datetime(2020,2,1,0,0,0)], ['foo', datetime(2020,3,1,0,0,0)],
['bar', datetime(2020,4,1,0,0,0)],['bar', datetime(2020,5,1,0,0,0)],['bar', datetime(2020,6,1,0,0,0)]]
df = pd.DataFrame(data, columns = ['id', 'timestamp'])
data = [['A', datetime(2020,1,15,0,0,0), datetime(2020,3,15,0,0,0) ], ['B', datetime(2020,4,15,0,0,0),datetime(2020,6,15,0,0,0)]]
gdf = pd.DataFrame(data, columns = ['geoid', 'starttime', 'endtime'])
df
id timestamp
0 foo 2020-01-01
1 foo 2020-02-01
2 foo 2020-03-01
3 bar 2020-04-01
4 bar 2020-05-01
5 bar 2020-06-01
gdf
geoid starttime endtime
0 A 2020-01-15 2020-03-15
1 B 2020-04-15 2020-06-15
我的目标是在df
上左连接gdf
,其中timestamp
位于starttime
和endtime
之间,因此输出如下所示:
res
id timestamp geoid
0 foo 2020-01-01 None
1 foo 2020-02-01 A
2 foo 2020-03-01 A
3 bar 2020-04-01 None
4 bar 2020-05-01 B
5 bar 2020-06-01 B
就我所研究的而言,pandas中唯一存在的时间连接方法是pandas.merge_asof()
,它不适合这个用例,因为目标是在时间戳之间合并,而不是最近的时间戳
pandas(不使用sqllite)中基于重叠时间戳将一个表与另一个表(左连接)合并的正确方法是什么
如果可能,使用由} 获取位置,并通过在numpy中使用
gdf
列创建的IntervalIndex
,然后通过^{None
If-1
索引获取geoid
(不匹配):或者使用交叉连接的解决方案,将} 在^{} 中进行筛选,最后通过^{} 添加新列,以便通过
df
的索引转换为reset_index
的列,以避免丢失索引值,并使用^{index
列与df.index
进行匹配:您可以创建一个伪列并使用^{} :
相关问题 更多 >
编程相关推荐