我有一个包含一列日期时间数据的数据框,其中我指定了与每个休息周期的开始和结束之间的中点相对应的行(在单独的状态列中)。
DateTime status
235 2024-05-03 15:26:35.0 None
236 2024-05-03 15:26:35.4 None
237 2024-05-03 15:26:35.8 None
238 2024-05-03 15:26:36.2 None
239 2024-05-03 15:26:36.6 None
240 2024-05-03 15:26:37.0 None
241 2024-05-03 15:26:37.4 None
242 2024-05-03 15:26:37.8 None
243 2024-05-03 15:26:38.2 None
244 2024-05-03 15:26:38.6 None
245 2024-05-03 15:26:39.0 midway
246 2024-05-03 15:26:39.4 None
247 2024-05-03 15:26:39.8 None
248 2024-05-03 15:26:40.2 None
249 2024-05-03 15:26:40.6 None
250 2024-05-03 15:26:41.0 None
251 2024-05-03 15:26:41.4 None
252 2024-05-03 15:26:41.8 None
253 2024-05-03 15:26:42.2 None
254 2024-05-03 15:26:42.6 None
休息周期持续 5 秒,因此开始时间为中点时间之前 2.5 秒,结束时间为中点时间之后 2.5 秒。 日期时间列中没有行正好位于中点时间之前或之后 2.5 秒,因此我想使用下一个最接近的行(无论它距中点时间是长于还是短于 2.5 秒)。 我想将数据插入到中点周围约 5 秒范围内所有行的状态列中。
到目前为止我看到的解决方案涉及逐行浏览数据框。 有没有 pandas 矢量方法来完成这个?
这就是我希望数据框在此操作后出现的方式:
DateTime status
235 2024-05-03 15:26:35.0 None
236 2024-05-03 15:26:35.4 None
237 2024-05-03 15:26:35.8 None
238 2024-05-03 15:26:36.2 None
239 2024-05-03 15:26:36.6 rest_start
240 2024-05-03 15:26:37.0 None
241 2024-05-03 15:26:37.4 rest
242 2024-05-03 15:26:37.8 rest
243 2024-05-03 15:26:38.2 rest
244 2024-05-03 15:26:38.6 rest
245 2024-05-03 15:26:39.0 midway
246 2024-05-03 15:26:39.4 rest
247 2024-05-03 15:26:39.8 rest
248 2024-05-03 15:26:40.2 rest
249 2024-05-03 15:26:40.6 rest
250 2024-05-03 15:26:41.0 rest
251 2024-05-03 15:26:41.4 rest_end
252 2024-05-03 15:26:41.8 None
253 2024-05-03 15:26:42.2 None
254 2024-05-03 15:26:42.6 None
我确实尝试过调整一些通过行迭代的逻辑,但这违背了使用数据框的目的
您可以使用 Pandas 的矢量化方法来标记每个中点周围 5 秒范围内的行。具体方法如下:
通过过滤 where status == 'midway' 来识别中点行。
对于每个中点,计算开始和结束时间(中点前后 2.5 秒)。
使用遮罩在每个中点周围最近的行内应用休息循环标签(rest_start、rest、rest_end)。
''' 将 pandas 导入为 pd
# Sample data
data = {
'DateTime': pd.to_datetime([
'2024-05-03 15:26:35.0', '2024-05-03 15:26:35.4', '2024-05-03 15:26:35.8',
'2024-05-03 15:26:36.2', '2024-05-03 15:26:36.6', '2024-05-03 15:26:37.0',
'2024-05-03 15:26:37.4', '2024-05-03 15:26:37.8', '2024-05-03 15:26:38.2',
'2024-05-03 15:26:38.6', '2024-05-03 15:26:39.0', '2024-05-03 15:26:39.4',
'2024-05-03 15:26:39.8', '2024-05-03 15:26:40.2', '2024-05-03 15:26:40.6',
'2024-05-03 15:26:41.0', '2024-05-03 15:26:41.4', '2024-05-03 15:26:41.8',
'2024-05-03 15:26:42.2', '2024-05-03 15:26:42.6'
]),
'status': [None] * 10 + ['midway'] + [None] * 9
}
df = pd.DataFrame(data)
# Define a time delta of 2.5 seconds
time_delta = pd.Timedelta(seconds=2.5)
# Find rows with midpoint status and iterate over them
midpoints = df[df['status'] == 'midway'].index
for midpoint in midpoints:
midpoint_time = df.loc[midpoint, 'DateTime']
# Define start and end range
start_time = midpoint_time - time_delta
end_time = midpoint_time + time_delta
# Apply conditions to select closest rows within the range
mask = (df['DateTime'] >= start_time) & (df['DateTime'] <= end_time)
selected_rows = df[mask].index
# Label the rows accordingly
df.loc[selected_rows[0], 'status'] = 'rest_start'
df.loc[selected_rows[-1], 'status'] = 'rest_end'
df.loc[selected_rows[1:-1], 'status'] = 'rest'
print(df)
'''
中点识别:定位并迭代中点行(状态=='midway')。
范围选择:对于每个中点,建立一个5秒的范围(中点前后各2.5秒)。
行掩码:布尔掩码捕获此范围内的行,自动选择最接近的行。
标签:此范围内的第一行获取rest_start标签,最后一行获取rest_end,其余行标记为rest。