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

使用Python处理CSV:检索列值并基于时间条件新增标记列

我来帮你搞定这个需求——要给CSV里的每条记录判断5小时前是否存在活动记录,然后新增一列标记对吧?先看看你的初步思路,咱们一步步调整完善:

核心问题分析

你的初步代码里混用了csv模块和pandas,而且逻辑上没实现“逐行检查每个时间点的5小时前”的需求:比如m是整个Time列批量减5小时,不是每条记录单独的时间点;search函数也没有完成判断和赋值的动作。

优化后的解决方案

用pandas处理时间序列数据会更高效简洁,下面是完整的实现代码:

步骤1:导入依赖并读取数据

import pandas as pd
from pandas.tseries.offsets import DateOffset

# 读取CSV文件
light3 = pd.read_csv('G:/light3.csv')
# 将Time列转为datetime类型(必须步骤,否则无法进行时间运算)
light3['Time'] = pd.to_datetime(light3['Time'])

步骤2:实现核心判断逻辑

假设你的“活动记录”列名为Activity(请根据实际列名替换),我们可以用两种方式实现:

方式1:高效批量判断(推荐,适合大数据量)

# 提取所有有活动记录的时间,转成集合用于快速查找
active_time_set = set(light3[light3['Activity'].notna()]['Time'])

# 给每条记录计算它的5小时前时间,然后判断该时间是否在活动时间集合中
light3['has_activity_5h_ago'] = light3['Time'].apply(
    lambda x: 1 if (x - DateOffset(hours=5)) in active_time_set else 0
)

方式2:逐行遍历(逻辑更直观,适合小数据量)

# 先初始化标记列为0
light3['has_activity_5h_ago'] = 0

# 提取有活动的时间列表
active_times = light3[light3['Activity'].notna()]['Time'].values

# 逐行检查每条记录的5小时前是否有活动
for idx, row in light3.iterrows():
    five_hours_ago = row['Time'] - DateOffset(hours=5)
    if five_hours_ago in active_times:
        light3.loc[idx, 'has_activity_5h_ago'] = 1

步骤3:保存结果(可选)

如果需要把结果保存回CSV:

light3.to_csv('G:/light3_with_mark.csv', index=False)
关键说明
  • 必须把Time列转为datetime类型,否则无法进行时间加减运算
  • 用集合存储活动时间是为了大幅提升查找效率,尤其是当你的CSV有几万条以上数据时
  • 如果你的“活动记录”不是指Activity列非空,而是指该列有特定值(比如1),只需要把light3['Activity'].notna()改成light3['Activity'] == 1即可

内容的提问来源于stack exchange,提问作者Rana Al Ameedee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:42:20