回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个数据框,其中有两列包含日期范围。你知道吗</p>
<p>原始数据如下所示:</p>
<pre><code>df1:
personid, visitto, intime, outtime
8, 8, 2017-07-01 06:00:00, 2017-07-01 08:00:00
17 8, 2017-07-02 09:00:00, 2017-07-02 10:00:00
df2:
location, open, close
8, 2017-07-01 04:00:00, 2017-07-01 13:00:00
</code></pre>
<p>以下是我迄今为止所做的:
1合并visito上的两个数据帧->;location</p>
<pre><code>merged_df:
personid, visitto, intime, outtime, location, open, close
8, 8, 2017-07-01 06:00:00, 2017-07-01 08:00:00, 8, 2017-07-01 04:00:00, 2017-07-01 13:00:00
17 8, 2017-07-02 09:00:00, 2017-07-02 10:00:00, 8, 2017-07-01 04:00:00, 2017-07-01 13:00:00
</code></pre>
<ol start=“2”>
<li>将带有日期的四列转换为间隔</li>
</ol>
<pre><code>personid, visitto, visittime, opentime
8, 8, [2017-07-01 06:00:00, 2017-07-01 08:00:00], [2017-07-01 04:00:00, 2017-07-01 13:00:00]
17 8, [2017-07-02 09:00:00, 2017-07-02 10:00:00], [2017-07-01 04:00:00, 2017-07-01 13:00:00]
</code></pre>
<p>我现在想过滤这个合并的间隔数据帧,只返回日期时间重叠的行。我的预期结果是:</p>
<pre><code>personid, visitto, visittime, opentime
8, 8, [2017-07-01 06:00:00, 2017-07-01 08:00:00], [2017-07-01 04:00:00, 2017-07-01 13:00:00]
</code></pre>
<p>使用iterrows()并逐行比较重叠,我成功地获得了所需的结果,但是,这非常冗长。我更喜欢这样做(非工作示例):</p>
<pre><code>merged_df.loc[merged_df['visittime'].overlaps(merged_df['opentime'])]
</code></pre>
<p>或者,在数据帧合并期间完成此操作。类似于(不起作用的例子):</p>
<pre><code>merge_df = pd.merge(df1[["personid", "visitto", "intime", "outtime"]], df2[["location", "open", "close"]], how='inner', left_on='visitto', right_on='location') #WHERE intime, outtime OVERLAPS open, close
</code></pre>
<p>是否可以从函数而不是循环执行此操作?这可以很容易地从数据库中的Sql中完成,但是,我正在努力找到一种有效的方法来在dataframe上执行此操作。你知道吗</p>