Python - 计算来自txt文件的行标签之间的时间差

3

在此输入图像描述我正在从一个包含时间戳的txt文件中读取数据。我需要从txt文件中读取数据并将结果写入另一个txt文件。因此,我需要对数据进行排序。

例如,我需要计算2020-08-28T11:46:24.8419656Z和2020-08-28T11:48:11.8418281Z之间XXXXXX的时间差,即总时间差。要计算“执行”时间,我需要减去2020-08-28T11:48:11.8418281Z和2020-08-28T11:46:39.9417366Z之间的时间。这些只是计算时间差的示例。如果出现错误,则需要在“测试状态”中打印为1。如果YYYYYY中存在错误,则只需将时间状态分配为0。在输出中,我给出了值以将它们显示为示例。

我该如何计算时间差,因为时间戳中间有T?另一个挑战是我需要根据列中的标签计算两行之间的差异。为了找到时间戳的名称(例如XXXXXXXX),我需要检查“#########”,然后才能进行排序,否则我不知道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

你好,INPUTinput.txt是一样的吗?因为我在INPUT中没有看到任何逗号。请附上input.txt文件的图像。 - r0ot293
字符串可以使用dateutil.parser.isoparse转换为datetime对象。以下是如何进行操作的链接(https://discuss.python.org/t/parse-z-timezone-suffix-in-datetime/2220)。 - r0ot293
1
@r0ot293 是的,它与输入文件相同。 - nobody
我可以问一下你是如何给Execution、Creation等输出赋值的吗?是两行之间的时间差吗? - r0ot293
@r0ot293 感谢您的帮助,我正在为“Execution”赋值,例如对于XXXXXX,“Execution”的时间是从2020-08-28T11:46:39.9397372Z到2020-08-28T11:46:39.9417366Z。这意味着当它通过另一个时,“Execution”时间在“Execution和Creation”之间。要计算“Creation”,请从2020-08-28T11:46:39.9417366Z开始,直到2020-08-28T11:46:41.4877509Z(直到Build)结束。 - nobody
1个回答

1
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')

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

但是我的目标是需要计算两个时间戳之间的时间差,关于它们的结束时间。例如,我需要定义我正在做什么的名称。因此,首先,我需要捕捉XXXXXX、YYYYYY、ZZZZZZ。然后,我需要计算总时间、执行时间、构建时间和创建时间的时间差。首先,我需要检查第1列和#####,然后捕捉名称作为XXXXXXX。之后开始计算时间差。 - nobody
1
@nobody 尝试运行上面的代码,我已经分别将dict['name']设置为类似于“XXXX..”或“YYYY..”这样的值。而且,time_diff变量存储了在#后面跟随的两个时间戳之间的差异。 - r0ot293
1
@nobody 我忘记 import 解析器了,请尝试新代码,它应该解决整个问题。如果有任何错误,请告诉我。 - r0ot293
非常感谢,它正在工作,还有一件事。如果差异小于0.01,则计算为0,但应写入完整数字。其次,您根据行号检查,例如在lline [4] - line [3]之间。也许行号可能不正确,但它们的标签顺序将是正确的。因此,是否可以检查标签而不是行?例如,在创建和执行之间。时间差= Line [Creation] - Line [execution]。 - nobody
@nobody 哪个东西? - r0ot293
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接