计算 python 中某个时间范围内发生的实例数的最有效方法是什么?

What is the most efficient way to count the number of instances occurring within a time frame in python?

我正在尝试 运行 一个简单的计数函数,它 运行 是一个事件时间数据帧(特别是手术)相对于另一个班次时间帧数据帧,returns 列表每个班次发生多少事件。不过,这些 csvs 有数千行,所以虽然我目前设置它的方式有效,但它需要永远。这是我的:

numSurgeries = [0 for shift in range(len(df.Date))]

for i in range(len(OR['PATIENT_IN_ROOM_DTTM'])):
    for shift in range(len(df.DateTime)):
        if OR['PATIENT_IN_ROOM_DTTM'][i] >= df.DateTime[shift] and OR['PATIENT_IN_ROOM_DTTM'][i] < df.DateTime[shift+1]:
            numSurgeries[shift] += 1

因此它循环遍历每个事件并检查它处于哪个班次时间范围内,然后增加该时间范围内的计数。合乎逻辑,可行,但绝对效率不高。

编辑:

Example of OR data file

Example of df data file

在没有示例数据的情况下,您并不清楚您想要什么。但这应该可以帮助您矢量化:

numSurgeries = {shift: np.sum((OR['PATIENT_IN_ROOM_DTTM'] >= df.DateTime[shift]) & \
                       (OR['PATIENT_IN_ROOM_DTTM'] < df.DateTime[shift+1])) \
                       for shift in range(len(df.Date))}

输出是一个将整数移位映射到 numSurgeries 的字典。

如上所述,没有示例数据很难回答。

但是,布尔掩码听起来很合适。参见

shift 创建一个日期掩码,我们将分别调用开始和结束日期 start_shiftend_shift。这些应该是 datetime 格式。

date_mask = (df['datetime'] >= start_shift) & (df['datetime'] <= end_shift)

找到 df 中符合此范围的所有值。

df_shift = df.loc[date_mask]

统计新df_shift中的实例数。

num_surgeries = len(df_shift.index())

循环所有班次。

def count_shifts(df, shift, results_df, start_shift, end_shift):

    date_mask = (df['datetime'] >= start_shift) & (df['datetime'] <= end_shift)
    df_shift = df.loc[date_mask]
    num_surgeries = len(df_shift.index())

    return(num_surgeries)

# iterates through df and applies the above function to every row
results_df['num_surgeries'] = results_df.apply(calculate_num_surgeries,axis=1)

另外记得按照PEP8 Style Guide命名变量! Python.

中不推荐驼峰式大小写