Python-根据txt文件中的标签计算行之间的时间差

Python-根据txt文件中的标签计算行之间的时间差,python,python-3.x,pandas,sorting,datetime,Python,Python 3.x,Pandas,Sorting,Datetime,我从一个有时间戳的txt文件中读取数据。我需要从一个txt文件中读取数据,并将结果写入另一个txt文件。因此,我需要对数据进行排序 例如,我需要计算XXXXXX在2020-08-28T11:46:24.8419656Z和2020-08-28T11:48:11.8418281Z之间的时间差,即总时间差。要计算“执行”时间,我需要减去2020-08-28T11:48:11.8418281Z和2020-08-28T11:46:39.9417366Z之间的时间差。这些只是计算时间差的示例。如果有错误,我

我从一个有时间戳的txt文件中读取数据。我需要从一个txt文件中读取数据,并将结果写入另一个txt文件。因此,我需要对数据进行排序

例如,我需要计算XXXXXX在2020-08-28T11:46:24.8419656Z和2020-08-28T11:48:11.8418281Z之间的时间差,即总时间差。要计算“执行”时间,我需要减去2020-08-28T11:48:11.8418281Z和2020-08-28T11:46:39.9417366Z之间的时间差。这些只是计算时间差的示例。如果有错误,我需要在“测试状态”中打印为1。yyyyy中有一个错误,因此如果时间状态不存在,我只需要将其指定为0。在输出中,我给出了一些值,作为示例显示它们

由于时间戳中间有T,我如何计算时间差?另一个挑战是,我需要计算两行之间关于列中标签的距离。要找出时间戳的名称(例如XXXXXXX),我需要检查“########”,然后我可以对其进行排序,否则我不知道txt文件中会出现哪个名称

from datetime import datetime

def time_diff(start, end):
    start_dt = datetime.strptime(start, '%H:%M:%S')
    end_dt = datetime.strptime(end, '%H:%M:%S')
    diff = (end_dt - start_dt)
    return diff.seconds

scores = {}
with open('input.txt') as fin:
    for line in fin.readlines():
        values = line.split(',')
        scores[values[0]] = time_diff(values[0],values[0])

with open('result.txt', 'w') as fout:
    for key, value in sorted(scores.iteritems(), key=lambda (k,v): (v,k)):
        fout.write('%s,%s\n' % (key, value))

INPUT:

2020-08-28T11:46:24.8419656Z ################################################################################
2020-08-28T11:46:24.8419656Z XXXXXX
2020-08-28T11:46:39.9397372Z Execution 0
2020-08-28T11:46:39.9417366Z Creation 0
2020-08-28T11:46:41.4877509Z Build 0
2020-08-28T11:48:02.6957708Z Level 0 
2020-08-28T11:48:02.7227683Z Converting file start
2020-08-28T11:48:11.7408315Z Converting done 0
2020-08-28T11:48:11.8148285Z Checking results
2020-08-28T11:48:11.8418281Z Test Status XXXXXX: Success
2020-08-28T11:48:11.8498273Z ################################################################################
2020-08-28T11:48:11.8498273Z YYYYYY
2020-08-28T11:48:27.1533026Z Execution 0
2020-08-28T11:48:27.1583035Z Creation 0
2020-08-28T11:48:28.6763028Z Build 0
2020-08-28T11:49:31.9180832Z Level 0 
2020-08-28T11:49:31.9440848Z ##[error]
2020-08-28T11:49:31.9530839Z ################################################################################
2020-08-28T11:50:24.8419656Z ZZZZZZ
2020-08-28T11:50:39.9397372Z Execution 0
2020-08-28T11:50:39.9417366Z Creation 0
2020-08-28T11:50:41.4877509Z Build 0
2020-08-28T11:51:02.6957708Z Level 0 
2020-08-28T11:51:02.7227683Z Converting file start
2020-08-28T11:51:11.7408315Z Converting done 0
2020-08-28T11:51:11.8148285Z Checking results
2020-08-28T11:51:11.8418281Z Test Status ZZZZZZ: Success
2020-08-28T11:51:31.9530839Z ################################################################################



OUTPUT:

Name       Total    Execution Creation Build Level Converting  Checking results   Test Status      
XXXXXX      10          2        2       2     2        2          2       2          0
YYYYYY      10          2        2       2     2        0          0       0          1
ZZZZZZ      10          2        2       2     2        2          2       2          0

您可以通过这种方式获得所有时间戳,然后通过切片数据获得两个时间戳之间的数据。如果有任何问题,请告诉我。

Hi,
INPUT
是否与
INPUT.txt
相同,因为我在
INPUT
中没有看到任何逗号。请附加“input.txt”文件的图像。可以使用
dateutil.parser.isoparse
将字符串转换为
datetime
对象。这是关于如何执行此操作的链接()。@r0ot293是的,它与输入文件相同。请问您如何为输出中的执行、创建等赋值?这是两行之间的时差吗?@r0ot293感谢您的帮助,我正在为XXXXXX的“执行”赋值,它介于2020-08-28T11:46:39.9397372Z到2020-08-28T11:46:39.9417366Z之间。这意味着当它通过另一个时,“执行”时间介于“执行和创建”之间。要计算“创建”,请从2020-08-28T11:46:39.9417366Z开始,到2020-08-28T11:46:41.4877509Z结束(直到构建)。但目标是我需要计算两个时间戳之间关于时间结束的时间差。例如,我需要定义我正在做的事情的名称。所以,首先,我要抓到XXXXXX,yyyyy,zzzz。然后我需要计算总时间、执行、构建和创建的时差。首先我需要检查第1列和######,然后捕获名称为XXXXXXX。然后开始计算时间diff@nobody请尝试运行我设置的上述代码
dict['name']
,分别使用'XXXX..或'YYYY..等值。
time\u diff
变量存储后面跟#的两个时间戳之间的差异。我得到了“NameError:name'parser'未定义”@没有人我忘了导入解析器,尝试新代码它应该可以解决整个问题。让我知道它是否工作或出现任何错误。非常感谢它正在工作,还有一件事。若差值小于0.01,则计算为0,但应写入完整数字。其次,您根据line[4]-行[3]之间的行号进行检查。可能行号不正确,但标签顺序正确。所以,可以检查标签而不是看线吗?例如,在创建和执行之间。时间差=行[创建]-行[执行]
import re
from dateutil import parser
import pandas as pd

with open('input.txt') as file:
    data = file.read()

timestamps = re.findall(r'(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}.+Z)\s#{3,}', data)
text = []
dict_list = []
for i in range(len(timestamps)-1):
    text.append(data[data.index(timestamps[i]):data.index(timestamps[i+1])])
    time_diff = parser.isoparse(timestamps[i+1]) - parser.isoparse(timestamps[i])
    # print(text[-1])
    lines = text[-1].split('\n')
    dict = {}
    dict['name'] = lines[1].split(' ')[1]
    dict['execution'] = (parser.isoparse(lines[3].split(' ')[0]) - parser.isoparse(lines[2].split(' ')[0])).seconds
    dict['creation'] = (parser.isoparse(lines[4].split(' ')[0]) - parser.isoparse(lines[3].split(' ')[0])).seconds
    dict['build'] = (parser.isoparse(lines[5].split(' ')[0]) - parser.isoparse(lines[4].split(' ')[0])).seconds
    dict['level'] = (parser.isoparse(lines[6].split(' ')[0]) - parser.isoparse(lines[5].split(' ')[0])).seconds
    if "error" in lines[-2]:
        dict['test_status'] = 1
        dict_list.append(dict)
        continue
    elif "Success" in lines[-2]:
        dict['test_status'] = 0
        dict['converting'] = (parser.isoparse(lines[7].split(' ')[0]) - parser.isoparse(lines[6].split(' ')[0])).seconds
        dict['checking'] = (parser.isoparse(lines[8].split(' ')[0]) - parser.isoparse(lines[7].split(' ')[0])).seconds
    dict_list.append(dict)


df = pd.DataFrame(dict_list)
df.to_csv('output.csv')