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

时间:2018-01-25 16:58:51

标签: python pandas datetime list-comparison

我正在尝试运行一个简单的计数功能,该功能运行事件时间(特别是手术)的数据帧与另一个移位时间帧的数据帧,并返回每个班次期间发生的事件数量的列表。但是,这些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

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

然而,布尔掩码听起来很合适。请参阅Select dataframe rows between two dates

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不建议使用Camelcase。