计算 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_shift
和 end_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.
中不推荐驼峰式大小写
我正在尝试 运行 一个简单的计数函数,它 运行 是一个事件时间数据帧(特别是手术)相对于另一个班次时间帧数据帧,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_shift
和 end_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.
中不推荐驼峰式大小写