Python - 从 txt 文件计算关于其标签的行之间的时间差

Posted

技术标签:

【中文标题】Python - 从 txt 文件计算关于其标签的行之间的时间差【英文标题】:Python - Calculate time difference between rows regarding their labels from a txt file 【发布时间】:2020-12-18 08:17:03 【问题描述】:

我正在从一个带有时间戳的 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。YYYYYY 中有错误,所以如果它们不存在,我只需将时间状态分配为 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

【问题讨论】:

嗨,INPUTinput.txt 相同,因为我在 INPUT 中看不到任何逗号。请附上“input.txt”文件的图片。 字符串可以使用dateutil.parser.isoparse转换为datetime对象。这是有关如何执行此操作的链接 (discuss.python.org/t/parse-z-timezone-suffix-in-datetime/2220)。 @r0ot293 是的,和输入文件一样。 请问您是如何在输出中为执行、创建等分配值的?是两条线的时间差吗? @r0ot293 感谢您的帮助,例如,我正在为 XXXXXX 的“执行”分配值,它介于 2020-08-28T11:46:39.9397372Z 到 2020-08-28T11 之间: 46:39.9417366Z。这意味着当它通过另一个时,“执行”时间介于“执行和创建”之间。要计算“Creation”,请从 2020-08-28T11:46:39.9417366Z 开始,到 2020-08-28T11:46:41.4877509Z 结束(直到 Build)。 【参考方案1】:
import re
from dateutil import parser
import pandas as pd

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

timestamps = re.findall(r'(\d4-\d2-\d2T\d2:\d2.+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 尝试运行上面的代码,我设置了 dict['name'] 的值,例如“XXXX..”或“YYYY..”。 time_diff 变量存储两个时间戳之间的差异,后跟 #。 我收到“NameError: name 'parser' is not defined” @nobody 我忘了import 解析器,试试它应该解决整个问题的新代码。让我知道它是否有效或出现任何错误。 非常感谢它正在工作,还有一件事。如果差值小于 0.01,则计算为 0,但应写入全位数。其次,您根据行号在 lline[4]-line[3] 之间进行检查。也许行号可能不正确,但它们的标签顺序是正确的。因此,可以检查标签而不是看线吗?例如,在创建和执行之间。时间差异= Line[Creation] - Line[execution]

以上是关于Python - 从 txt 文件计算关于其标签的行之间的时间差的主要内容,如果未能解决你的问题,请参考以下文章

从.txt文件复制文本并将其分配给Python中的变量[重复]

从 .txt 文件中读取数据并在 Python 中计算平均值

将字典保存为 Python 脚本

python读取TXT内容后怎么计算里面数据?

Cntk个人数据集

利用python和shell脚本生成train.txt的标签文件