You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

时间序列DataFrame间匹配时间区间并修改Flag字段的需求

时间序列DataFrame的Flag批量修改方案

问题描述

现有两个时间序列DataFrame:

  • df1中每个ID+Name组合对应3分钟间隔的时间窗口,包含Quantity和Flag字段
  • df2记录了特定ID+Name的时间点

需求:当df2中相同ID、Name的时间落在df1某行的3分钟时间窗口内,且该行Quantity为0时,将df1对应行的Flag修改为'Y'。

数据示例

df1初始结构

ID  Name  Time    Quantity   Flag
A   A     00:00:00   6         N
A   A     00:03:00   0         N
A   A     00:06:00   9         N
A   B     01:09:00   3         N
C   A     02:00:00   5         N
C   A     02:03:00   0         N

df2结构

ID  Name  Time
A   A     00:00:03 
A   A     00:04:06
A   B     00:05:02
C   A     02:01:05

期望输出

ID  Name  Time     Quantity  Flag
A   A     00:00:00   6        N
A   A     00:03:00   0        Y
A   A     00:06:00   9        N
A   B     01:09:00   3        N
C   A     02:00:00   5        N
C   A     02:03:00   0        Y

解决方案

使用Pandas处理时间匹配和字段更新,代码如下:

import pandas as pd

# 构造示例数据(实际使用时替换为你的真实数据)
df1 = pd.DataFrame({
    'ID': ['A', 'A', 'A', 'A', 'C', 'C'],
    'Name': ['A', 'A', 'A', 'B', 'A', 'A'],
    'Time': ['00:00:00', '00:03:00', '00:06:00', '01:09:00', '02:00:00', '02:03:00'],
    'Quantity': [6, 0, 9, 3, 5, 0],
    'Flag': ['N'] * 6
})

df2 = pd.DataFrame({
    'ID': ['A', 'A', 'A', 'C'],
    'Name': ['A', 'A', 'B', 'A'],
    'Time': ['00:00:03', '00:04:06', '00:05:02', '02:01:05']
})

# 1. 将时间列转换为datetime类型,支持区间运算
df1['Time'] = pd.to_datetime(df1['Time'], format='%H:%M:%S')
df2['Time'] = pd.to_datetime(df2['Time'], format='%H:%M:%S')

# 2. 为df1计算每个时间窗口的结束时间(起始时间+3分钟)
df1['window_end'] = df1['Time'] + pd.Timedelta(minutes=3)

# 3. 按ID+Name分组,匹配符合条件的行
matched_indices = []
for (id_val, name_val), df2_group in df2.groupby(['ID', 'Name']):
    # 获取df1中对应ID+Name的分组
    df1_group = df1[(df1['ID'] == id_val) & (df1['Name'] == name_val)]
    # 遍历df2当前分组的每个时间点,匹配窗口内且Quantity=0的行
    for _, df2_row in df2_group.iterrows():
        mask = (df1_group['Time'] <= df2_row['Time']) & \
               (df1_group['window_end'] > df2_row['Time']) & \
               (df1_group['Quantity'] == 0)
        matched_indices.extend(df1_group[mask].index.tolist())

# 4. 去重并更新Flag字段
matched_indices = list(set(matched_indices))
df1.loc[matched_indices, 'Flag'] = 'Y'

# 5. 清理辅助列,恢复时间列格式
df1 = df1.drop('window_end', axis=1)
df1['Time'] = df1['Time'].dt.strftime('%H:%M:%S')

# 打印结果
print(df1)

关键步骤说明

  • 时间类型转换:将字符串格式的时间转为datetime类型,才能进行区间比较和运算。
  • 窗口结束时间计算:根据df1的3分钟间隔规则,为每行生成窗口结束时间,明确判断范围。
  • 分组匹配:按ID和Name分组后,精准匹配同组内的时间窗口,避免跨组误匹配。
  • 去重更新:对匹配到的行索引去重,防止同一行被多次修改。

内容的提问来源于stack exchange,提问作者MemeFast King

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:10:32