<p>如果可能,使用由<code>gdf</code>列创建的<code>IntervalIndex</code>,然后通过<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Index.get_indexer.html" rel="nofollow noreferrer">^{<cd3>}</a>获取位置,并通过在numpy中使用<code>None</code>If<code>-1</code>索引获取<code>geoid</code>(不匹配):</p>
<pre><code>s = pd.IntervalIndex.from_arrays(gdf['starttime'], gdf['endtime'], closed='both')
arr = gdf['geoid'].to_numpy()
pos = s.get_indexer(df['timestamp'])
df['new'] = np.where(pos != -1, arr[pos], None)
print (df)
id timestamp new
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
</code></pre>
<p>或者使用交叉连接的解决方案,将<code>df</code>的索引转换为<code>reset_index</code>的列,以避免丢失索引值,并使用<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html" rel="nofollow noreferrer">^{<cd10>}</a>在<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.between.html" rel="nofollow noreferrer">^{<cd9>}</a>中进行筛选,最后通过<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html" rel="nofollow noreferrer">^{<cd11>}</a>添加新列,以便通过<code>index</code>列与<code>df.index</code>进行匹配:</p>
<pre><code>df1 = df.reset_index().assign(a=1).merge(gdf.assign(a=1), on='a')
df1 = df1.loc[df1['timestamp'].between(df1['starttime'], df1['endtime']), ['index','geoid']]
df['geoid'] = df1.set_index('index')['geoid']
print (df)
id timestamp geoid
0 foo 2020-01-01 NaN
1 foo 2020-02-01 A
2 foo 2020-03-01 A
3 bar 2020-04-01 NaN
4 bar 2020-05-01 B
5 bar 2020-06-01 B
</code></pre>