0

我正在尝试运行一个简单的计数函数,该函数针对另一个轮班时间帧的数据帧运行事件时间(特别是手术)的数据帧,并返回每个轮班期间发生多少事件的列表。不过,这些 csv 有数千行,所以虽然我设置它的方式目前有效,但它需要很长时间。这就是我所拥有的:

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

因此,它遍历每个事件并检查它在哪个班次时间范围内,然后增加该时间范围内的计数。合乎逻辑,有效,但绝对没有效率。

编辑:

OR 数据文件示例

df数据文件示例

4

2 回答 2

0

如果没有示例数据,就不清楚您想要什么。但这应该可以帮助您矢量化:

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。

于 2018-01-25T17:11:48.590 回答
0

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

但是,布尔掩码听起来很合适。请参阅选择两个日期之间的数据框行

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

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

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

df_shift = df.loc[date_mask]

计算 new 中的实例数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 样式指南命名变量!在 Python 中不推荐使用 Camelcase。

于 2018-01-25T17:59:01.453 回答