Pandas/Python 如何根据与特定行的指定间隔最接近的值将数据插入到列行中

问题描述 投票:0回答:1

我有一个包含一列日期时间数据的数据框,其中我指定了与每个休息周期的开始和结束之间的中点相对应的行(在单独的状态列中)。

                  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 dataframe nearest-neighbor
1个回答
0
投票

您可以使用 Pandas 的矢量化方法来标记每个中点周围 5 秒范围内的行。具体方法如下:

  1. 通过过滤 where status == 'midway' 来识别中点行。

  2. 对于每个中点,计算开始和结束时间(中点前后 2.5 秒)。

  3. 使用遮罩在每个中点周围最近的行内应用休息循环标签(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。

© www.soinside.com 2019 - 2024. All rights reserved.