<p>让我们创建一些示例数据</p>
<pre><code>from datetime import datetime, timedelta
ref = now.replace(minute=0, second=0, microsecond=0)
def shifted(i): return ref + timedelta(hour=i)
df = pd.DataFrame([
('A', 'B', shifted(1), shifted(10)),
('C', 'D', shifted(-5), shifted(-1))],
columns=['name', 'email', 'start', 'end'])
</code></pre>
<p>数据如下所示</p>
<pre><code> name email start end
0 A B 2021-08-27 12:00:00 2021-08-27 21:00:00
1 C D 2021-08-27 06:00:00 2021-08-27 05:00:00
</code></pre>
<p>您可以使用<code>apply</code>函数拆分每一行,确保返回一个<code>pd.Series</code></p>
<pre><code>new_start = df.apply(lambda row: pd.Series(pd.date_range(row.start, row.end, freq='H')), axis=`).stack()
</code></pre>
<p>在这之后,<code>new_start</code>是每小时的开始,有一个双索引,一个是原始索引,一个是特定块的顺序,也可能有用</p>
<pre><code>0 0 2021-08-27 12:00:00
1 2021-08-27 13:00:00
2 2021-08-27 14:00:00
3 2021-08-27 15:00:00
4 2021-08-27 16:00:00
5 2021-08-27 17:00:00
6 2021-08-27 18:00:00
7 2021-08-27 19:00:00
8 2021-08-27 20:00:00
9 2021-08-27 21:00:00
1 0 2021-08-27 06:00:00
1 2021-08-27 07:00:00
2 2021-08-27 08:00:00
3 2021-08-27 09:00:00
4 2021-08-27 10:00:00
dtype: datetime64[ns]
</code></pre>
<p>现在只需将其连接到原始帧</p>
<pre><code>res = df[["name", "email"]].join(
new_start.reset_index(1, drop=True).rename("start"))
</code></pre>
<p>您可以像这样添加<code>end</code>列</p>
<pre><code>res["end"] = res.start + timedelta(hours=1)
</code></pre>