如何解决Python-计算有关txt文件中标签的行之间的时差
我正在从带有时间戳的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
解决方法
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')
您可以通过这种方式获取所有时间戳,然后可以通过对数据进行切片来获取两个时间戳之间的数据。让我知道是否有问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。