如何使用Python查找以前出现的CSV行

如何使用Python查找以前出现的CSV行,python,python-3.x,pandas,dataframe,csv,Python,Python 3.x,Pandas,Dataframe,Csv,我已将我的CSV简化如下: Job,Task,Operator,Comment,Time,Required Forklift,Crating,John,Daily Task,2020/11/23 00:14:59.280,Y Truck,Crating,Steve,Daily Task,2020/11/23 01:14:59.280,N Truck,Storage,Brain,Daily Task,2020/11/23 02:14:59.280,Y Forklift,Crating,John,D

我已将我的CSV简化如下:

Job,Task,Operator,Comment,Time,Required
Forklift,Crating,John,Daily Task,2020/11/23 00:14:59.280,Y
Truck,Crating,Steve,Daily Task,2020/11/23 01:14:59.280,N
Truck,Storage,Brain,Daily Task,2020/11/23 02:14:59.280,Y
Forklift,Crating,John,Daily Task,2020/11/23 03:14:59.280,Y
Shop Floor,Stacking,Steve,Weekly,2020/11/23 04:14:59.280,N
Truck,Storage,Brain,Daily Task,2020/11/23 06:14:59.280,Y
Forklift,Crating,John,Daily Task,2020/11/23 08:14:59.280,Y
Forklift,Crating,John,Daily Task,2020/11/23 10:14:59.280,Y
Truck,Storage,Brain,Daily Task,2020/11/23 12:14:59.280,Y
我希望找到所需的任务以及此任务的上一个开始时间。因此,在本例中,我希望输出类似于:

Job         Task        Operator    Comment      Time               Previous Time
Forklift    Crating     John        Daily Task  11/23/2020 3:14     11/23/2020 0:14
Truck       Storage     Brain       Daily Task  11/23/2020 6:14     11/23/2020 2:14
到目前为止,我的代码找到了所需的任务并将单元格分配给DFs。但我不知道如何通过csv循环找到匹配行的前一个时间

import csv
import pandas
import datetime
from datetime import datetime, timedelta

Job=[]
Task=[]
Oper=[]
Time=[]
Comment=[]

with open('Job.csv','r') as source:
    reader = csv.reader((line.replace('\0','') for line in source), delimiter=",", quotechar='"')
    next(reader, None)
    count = 0
    CurrentTime = datetime.now()
    Last24HrsTime = CurrentTime - timedelta(hours=24)
    print(Last24HrsTime)
    for row in reader:
            count += 1
            Required_Row = row[5]
            JobStartTime = row[4]
            if JobStartTime in (None, ""):
                JobStartTimeFormat = "2019/09/08 01:01:59.280" #In case there is an error and the date is blank.
            else:
                JobStartTimeFormat = datetime.strptime(JobStartTime, '%Y/%m/%d %H:%M:%S.%f')
                JobStartTimeFormatPrint = datetime.strftime(JobStartTimeFormat, '%Y/%m/%d %H:%M')
            if Required_Row == "Y" and JobStartTimeFormat >= Last24HrsTime:    #Is the job required and Job start is in the last 24hrs?
                JobID = row[0]
                TaskID = row[1]
                OperID = row[2]
                SearchRow = count + 1
                Job.append({'Job': row[1]})
                Task.append({'Task': row[2]})
                Oper.append({'Oper': row[2]})
                Time.append({'Tool': 'JobStartTimeFormatPrint'})
                Comment.append({'Comment': row[3]})

##Need to loop here to find preivous values
其电流输出为:

Forklift Crating John 2020/11/23 00:14 Daily Task
Truck Storage Brain 2020/11/23 02:14 Daily Task
Forklift Crating John 2020/11/23 03:14 Daily Task
Truck Storage Brain 2020/11/23 06:14 Daily Task
Forklift Crating John 2020/11/23 08:14 Daily Task
Forklift Crating John 2020/11/23 10:14 Daily Task
Truck Storage Brain 2020/11/23 12:14 Daily Task

你知道如何循环并找到以前的事件吗?

在这种情况下,我不会使用循环,它会变得有点混乱。您想要的是前一次每组(如任务)。前一时间定义为:假定行按时间排序,则前一行为。可以使用
.shift(1)
获取上一行

完整示例:

导入csv
进口大熊猫
#将数据转换为字典列表
打开(“my_csv_file.csv”、“r”)作为f:
reader=csv.DictReader(f)
数据=[dict(行)用于行输入读卡器]
df=熊猫。数据帧(数据)
#解析时间域
df[“Time”]=pandas.to_datetime(df[“Time”])
#仅选择所需的任务
df=df.loc[df[“必需”]=“Y”]
def get_PREVICE_time_per_组(组:pandas.DataFrame)->pandas.DataFrame:
“”方法将上一次作为每个组的列获取。
Args:
组(pandas.DataFrame):输入组(由groupby命令创建)
返回:
pandas.DataFrame:具有上一时间列的结果组
"""
#按时间列排序
组=组。排序值(“时间”)
#通过将时间列移动1个位置来获取上一个时间
组[“上一次”]=组[“时间”]。班次(1)
#返回组,包括上一次
返回组
#按任务(或任何您想要的)对数据帧进行分组,并按组获取上一个时间列
df=df.groupby(“任务”).apply(获取每个组的上一次时间)
#清理groupby创建的索引
df=df.droplevel(0).sort_index()
完整示例:

导入io
导入csv
进口大熊猫
f=io.StringIO(““”作业、任务、操作员、注释、时间,必填项
叉车,装箱,约翰,每日任务,2020/11/23 00:14:59.280,Y
卡车,板条箱,史蒂夫,每日任务,2020/11/23 01:14:59.280,N
卡车,储存,大脑,日常任务,2020/11/23 02:14:59.280,Y
叉车,装箱,约翰,每日任务,2020/11/23 03:14:59.280,Y
Steve Stacking车间,每周,2020/11/23 04:14:59.280,北卡罗来纳州
卡车,储存,大脑,日常任务,2020/11/23 06:14:59.280,Y
叉车,装箱,约翰,每日任务,2020/11/23 08:14:59.280,Y
叉车,装箱,约翰,每日任务,2020/11/23 10:14:59.280,Y
卡车,储存,大脑,日常任务,2020/11/23 12:14:59.280,Y
""")
#将数据转换为字典列表
reader=csv.DictReader(f)
数据=[dict(行)用于行输入读卡器]
df=熊猫。数据帧(数据)
#解析时间域
df[“Time”]=pandas.to_datetime(df[“Time”])
#仅选择所需的任务
df=df.loc[df[“必需”]=“Y”]
def get_PREVICE_time_per_组(组:pandas.DataFrame)->pandas.DataFrame:
“”方法将上一次作为每个组的列获取。
Args:
组(pandas.DataFrame):输入组(由groupby命令创建)
返回:
pandas.DataFrame:具有上一时间列的结果组
"""
#按时间列排序
组=组。排序值(“时间”)
#通过将时间列移动1个位置来获取上一个时间
组[“上一次”]=组[“时间”]。班次(1)
#返回组,包括上一次
返回组
#按任务(或任何您想要的)对数据帧进行分组,并按组获取上一个时间列
df=df.groupby(“任务”).apply(获取每个组的上一次时间)
#清理groupby创建的索引
df=df.droplevel(0).sort_index()
输出


打印(df)
所需的作业任务操作员评论时间\
0叉车装箱约翰日任务2020-11-23 00:14:59.280 Y
2卡车存储大脑每日任务2020-11-23 02:14:59.280 Y
3叉车装箱约翰每日任务2020-11-23 03:14:59.280 Y
5卡车存储大脑每日任务2020-11-23 06:14:59.280 Y
6叉车装箱约翰每日任务2020-11-23 08:14:59.280 Y
7叉车装箱约翰每日任务2020-11-23 10:14:59.280 Y
8卡车存储大脑每日任务2020-11-23 12:14:59.280 Y
上次
0纳特
2纳特
3 2020-11-23 00:14:59.280  
5 2020-11-23 02:14:59.280  
6 2020-11-23 03:14:59.280  
7 2020-11-23 08:14:59.280  
8 2020-11-23 06:14:59.280  

注意:如果数据中没有以前的时间,则值将为
NaT
(非时间)

对于要分组的项目,作业任务操作员注释是否总是相同?@juanpa.arrivillaga,对于分组,匹配行的作业、任务、操作员和注释都相同。唯一的区别是时间。看起来不错,但是我可以编辑第6行(f=io.StringIO)来读取CSV文件吗?@Buckzer,我添加了一个文件示例<代码>io.StringIO类似于内存中的文件(这对于这样的演示脚本很好)。但它的工作原理与普通文件相同。太棒了!谢谢你的帮助。需要熟悉分组!