计算时间间隔之间的行数

我有一个带有开始和结束时间 (datetime.time) 的 Pandas DataFrame 用于进程列表:


from datetime import time

import pandas as pd

df = pd.DataFrame(columns=['start', 'end'], 

                  index=pd.Index(['proc01', 'proc02'], name='Processes'), 

                  data=[

                        [time(10), time(14)], 

                        [time(12), time(16)]

                  ])

我想将此信息转换为一个直方图,用于计算正在运行的进程数:


>>> bins = pd.date_range('08:00', '22:00', freq='1H').time

>>> count_processes(df, bins)

array([0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0])

我有一个实现,但是对于大数据帧(大约 2~3 百万行)来说有点慢,我想知道是否有办法对其进行矢量化或至少使其更快:


def count_processes(df, bins):

     result = np.zeros_like(bins, dtype=int)

     for _, row in df.iterrows():

         aux = (row['start'] <= bins) & (bins < row['end'])

         result += aux.astype(int)

     return result


跃然一笑
浏览 182回答 2
2回答

12345678_0001

迭代数据帧通常是您未pandas最佳使用的标志。您可以改为从已启动的进程中减去已结束的进程,如下所示:res = []for b in bins:&nbsp; &nbsp; s = (df['start'] < b).sum()&nbsp; &nbsp; e = (df['end'] < b).sum()&nbsp; &nbsp; res.append(s-e)# [0, 0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python