时间序列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
相关产品推荐
相关产品推荐

