我需要处理一系列日志文件,并将这些文件中的字符串数据转换为一个数据帧以进行分析。每个日志文件包含一对或多对与ID,错误发生和错误清除时间相对应的行。但是,如果在不同的ID上同时存在多个错误,则会在连续的行中将这些错误作为一组列出,然后将相应的“已清除”行作为一组列出。
我可以为数据的每一行拆分字符串,并且可以轻松地将新行追加到数据框。但是我不知道如何将每对行中的日期组合到df中的一行中,尤其是因为它们不一定必须一次订购一对。
简化的示例日志文件(下面的代码中为“ example.log”:]
ID1 Error code A
ID1 Error cleared: 00:01:00
ID2 Error code B
ID3 Error code B
ID4 Error code A
ID2 Error cleared: 00:02:00
ID3 Error cleared: 00:02:00
ID4 Error cleared: 00:02:00
ID5 Error code B
ID5 Error cleared: 00:03:00
ID2 Error code A
ID2 Error cleared: 00:04:00
ID6 Error code A
ID6 Error cleared: 00:05:00
所需的数据框:
TID ERROR CLEARED
0 ID1 A 00:01:00
1 ID2 B 00:02:00
2 ID3 B 00:02:00
3 ID4 A 00:02:00
4 ID5 B 00:03:00
5 ID2 A 00:04:00
6 ID6 A 00:05:00
此代码将产生一个df,其中所有数据都在正确的列中,但日志的每一行都有一行。我想每对错误/时间清除的数据只有1行。
import pandas as pd
df=pd.DataFrame()
with open('example.log') as file:
for line in file:
part = line.split()
tid=part[0]
if 'code' in line:
error=part[3]
if 'cleared' in line:
time=part[3]
dfx=pd.DataFrame([[tid,error,time]],columns=['TID','ERROR','CLEARED'])
df=df.append(dfx, ignore_index=True)
tid=''
error=''
time=''
导致过多不必要的行:
TID ERROR CLEARED
0 ID1 A
1 ID1 00:01:00
2 ID2 B
3 ID3 B
4 ID4 A
5 ID2 00:02:00
6 ID3 00:02:00
7 ID4 00:02:00
8 ID5 B
9 ID5 00:03:00
10 ID2 A
11 ID2 00:04:00
12 ID6 A
13 ID6 00:05:00
如果我缩进最后几行,以使新行仅在“清除”行之后生成,则该行接近我想要的行,但是错误未正确填充。
import pandas as pd
df=pd.DataFrame()
with open('example.log') as file:
for line in file:
part = line.split()
tid=part[0]
if 'code' in line:
error=part[3]
if 'cleared' in line:
time=part[3]
dfx=pd.DataFrame([[tid,error,time]],columns=['TID','ERROR','CLEARED'])
df=df.append(dfx, ignore_index=True)
tid=''
error=''
time=''
每次出现一行,但错误列中的数据不一致:
TID ERROR CLEARED
0 ID1 A 00:01:00
1 ID2 A 00:02:00
2 ID3 00:02:00
3 ID4 00:02:00
4 ID5 B 00:03:00
5 ID2 A 00:04:00
6 ID6 A 00:05:00
有人可以帮助我将数据提取到数据框中,以便正确地排列错误吗?谢谢。
尝试使用类似的方法:
import pandas as pd
from io import StringIO
import numpy as np
data = """
ID1 Error code A
ID1 Error cleared: 00:01:00
ID2 Error code B
ID3 Error code B
ID4 Error code A
ID2 Error cleared: 00:02:00
ID3 Error cleared: 00:02:00
ID4 Error cleared: 00:02:00
ID5 Error code B
ID5 Error cleared: 00:03:00
ID2 Error code A
ID2 Error cleared: 00:04:00
ID6 Error code A
ID6 Error cleared: 00:05:00
"""
df = pd.read_csv(StringIO(data),sep=' ',header=None,names=["ID", "ER", "CODE", "ERROR"])
df['CLEARED'] = np.where(df['CODE']=='cleared:', df['ERROR'], np.nan)
df=df.bfill()
df=df.loc[df['CODE'] == 'code']
#df=df.drop(['ER','CODE'], inplace=True, axis=1)
print(df.drop(['ER', 'CODE'], axis=1).reset_index(drop=True))
结果:
ID ERROR CLEARED
0 ID1 A 00:01:00
1 ID2 B 00:02:00
2 ID3 B 00:02:00
3 ID4 A 00:02:00
4 ID5 B 00:03:00
5 ID2 A 00:04:00
6 ID6 A 00:05:00