【发布时间】:2020-05-20 10:41:26
【问题描述】:
我有一个数据集,它显示了一组进程的开始和结束时间戳。我想计算任何给定分钟内活动的进程数。 pandas group/merge/join 操作似乎都不适合这里。这是一个测试数据集:
_range = pd.date_range(start='2020-03-01', end='2020-03-02', freq='1H')
start_ts = [random.choice(_range) for _ in range(48)]
end_ts = [r + datetime.timedelta(minutes=random.randint(1, 120)) for r in start_ts]
_processes = [random.choice(['Django', 'Flask', 'Pyramid', 'CherryPie']) for _ in start_ts]
df = pd.DataFrame({'start_time': start_ts, 'end_time': end_ts, 'process': _processes})
df.head()
start_time end_time process
0 2020-03-01 00:00:00 2020-03-01 00:01:00 Django
1 2020-03-01 01:00:00 2020-03-01 01:04:00 Django
2 2020-03-01 02:00:00 2020-03-01 02:05:00 Flask
3 2020-03-01 03:00:00 2020-03-01 03:09:00 Flask
4 2020-03-01 04:00:00 2020-03-01 04:26:00 CherryPie
我必须计算 2020/03/01 到 2020/03/02 之间每 1 分钟间隔的活动进程数。 这是我能想到的一种解决方案:
- 在所述开始/结束日期之间创建一个 1 分钟间隔的数据帧
- 对于每 1 分钟的时间间隔,如果 start_ts 或 end_ts 介于给定分钟之间,则迭代主数据帧并将记录分桶。
这是一个示例解决方案:
df_stat = pd.DataFrame(index=pd.date_range(start='2020-03-01', end='2020-03-02', freq='1T'), columns=['count'])
for ts in df_stat.index:
df_stat.loc[ts] = len(df[(df.start_time <= ts) & (df.end_time >= ts)])
df_stat.head()
count
2020-03-01 00:00:00 2
2020-03-01 00:01:00 2
2020-03-01 00:02:00 2
2020-03-01 00:03:00 2
2020-03-01 00:04:00 2
这看起来不是一个优雅的解决方案。当观察窗口很大时,迭代可能需要更长的时间。有没有我们可以在这里使用的原生 pandas 运算符?
【问题讨论】: