计算时间间隔之间的行数

时间:2018-11-30 14:48:52

标签: python pandas

我有一个带有开始和结束时间(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到300万行)来说有点慢,我想知道是否有一种方法可以向量化它,或者至少使其更快:

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

2 个答案:

答案 0 :(得分:3)

在数据框上进行迭代通常是您没有最佳使用pandas的信号。您可以改为从已经开始的过程中减去已经结束的过程,例如:

res = []
for b in bins:
    s = (df['start'] < b).sum()
    e = (df['end'] < b).sum()
    res.append(s-e)
# [0, 0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0]

答案 1 :(得分:0)

正在使用Drawing drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 10, 12, 35); Chart chart = drawing.createChart(anchor); CTChart ctChart = ((XSSFChart)chart).getCTChart(); CTPlotArea ctPlotArea = ctChart.getPlotArea(); CTPieChart ctPieChart = ctPlotArea.addNewPieChart(); CTBoolean ctBoolean = ctPieChart.addNewVaryColors(); ctBoolean.setVal(true); CTPieSer ctPieSer = ctPieChart.addNewSer(); ctPieSer.addNewIdx().setVal(0); String F1,F2 = new String(); F1 = "query terms vs. Ort!$B$1:$I$1"; F2="query terms vs. Ort!$B$2:$I$2"; CTAxDataSource cttAxDataSource = ctPieSer.addNewCat(); CTStrRef ctStrRef = cttAxDataSource.addNewStrRef(); ctStrRef.setF(F1); CTNumDataSource ctNumDataSource = ctPieSer.addNewVal(); CTNumRef ctNumRef = ctNumDataSource.addNewNumRef(); ctNumRef.setF(F2); CTLegend ctLegend = ctChart.addNewLegend(); ctLegend.addNewLegendPos().setVal(STLegendPos.B); ctLegend.addNewOverlay().setVal(false); // title CTTitle ctTitle = ctChart.addNewTitle(); ctTitle.addNewOverlay().setVal(false); ctTitle.addNewTx().addNewRich().addNewBodyPr(); ctTitle.getTx().getRich().addNewP().addNewR().setT(S); 董事会广播,很遗憾,这是O(m * n)解决方案,请尝试使用您的真实数据,如果您有任何问题,请告诉我

numpy