首页 > 解决方案 > Python Pandas - 如果时间戳落在多个开始时间和结束时间之间,则标记

问题描述

我有两个数据框,一个是一系列时间戳和数据,另一个包含每行的开始和结束时间。让我们分别调用这些 df_series 和 df_interval。

我想在 df_series 中创建一个新列,然后遍历 df_interval 的每一行并在 df_series 介于开始时间和结束时间之间时引发一个标志。

我首先在 df_series 中创建一个空列,然后遍历行并应用 np.where 函数。

为了完整起见,df_series['ts'] 对应于时间戳,df_event['start'] 对应于开始时间,df_event['end'] 对应于结束时间。

    df_series['event'] = np.nan
    for index, row in df_event.iterrows():
        df_series['event'] = np.where((df_series['ts'] > row['start']) & (df_series['ts'] < row['end']), 1, 0)

但是,当我运行上面的代码时,尽管“ts”的值介于“start”和“end”的值之间,但它只返回零值。它不会抛出任何错误,但没有像我预期的那样表现。

标签: pythonpandas

解决方案


我通过采取不同的方法解决了这个问题。

首先,创建一个空数据帧,然后遍历 df_events,根据每一行对 df_series 应用掩码,并将结果附加到这个空数据帧。然后将新数据框与现有的 df_series 合并。请参阅下面的示例代码。

events = pd.DataFrame()
for index, row in df_events.iterrows():
    mask = (df_series['ts'] >= row['start']) & (df_series['ts'] <= row['end'])
    events = events.append(df_series.loc[mask])
events['event'] = 1
events = events['event']

series_events = df_series.merge(events, left_index=True, right_index=True, how='left')

推荐阅读