2016-10-31 3 views
1

깨끗한 DF로 들어가기를 원하는 까다로운 로그 파일이 있습니다. 로그 형식은 다음과 같습니다.팬더 데이터 프레임에 파선으로 로그 읽기

=============================================================================== 
2016/03/28 12:26:45 - Message 
------------------------------------------------------------------------------- 
2016/03/28 12:26:45 - Message 
2016/03/28 12:26:45 - Message 
Message 
2016/03/28 12:26:45 - Message 
2016/03/28 12:26:46 - Message 
2016/03/28 12:26:46 - Message 
2016/03/28 12:28:30 - Message 
2016/03/28 12:28:40 - Message 
2016/03/28 12:28:40 - Message 
2016/03/28 12:28:40 - Message 
------------------------------------------------------------------------------- 
2016/03/28 12:28:40 - Message 
=============================================================================== 

로그는 위의 패턴에서 계속됩니다. 제 목표는 다음 데이터 프레임을 갖는 것입니다. '-'와 Dataframe를 만들고, 점선을 제거

Time     Text 
2016/03/28 12:26:45 Message 

는 난의 파일 파일을 구문 분석 피곤합니다. I가 NaN 열을 많이 얻을 그러나

import pandas as pd 
from pandas.compat import StringIO 

clean = open(filename).read().remove('-------------------------------------------------------------------------------', '') 
clean2 = open(filename).read().replace('===============================================================================', '') 
df = pd.read_csv(filename, sep = "\s*\-", names = ["Time", "Text"], engine = "python") 
df.Time = pd.to_datetime(df.Time, format='%d/%m/%y %H:%M:%S.%f') 
df.Text = df.Text 

, 도움은 당신이 errors='coerce'으로 to_datetime를 사용하기위한 곳 NaTTime 제거를위한 dropnaNaT에 모든 행을 잘못된 데이터를 대체 할 수 있다고 생각

+0

더블 대쉬 라인은 파일의 시작과 파일의 끝 부분에있는 스크립트의 끝에서? – jezrael

+0

그들은 모든 섹션의 시작과 끝에 있기 때문에 로그 파일에는 이중 대시 파일의 인스턴스가 많습니다. 로그 파일은 게시물에 지정된 패턴을 따르므로이 패턴은 파일에서 여러 번 발생합니다 @jeszrael – ukbaz

답변

2

를 감사 :

import pandas as pd 
from pandas.compat import StringIO 

temp=u"""=============================================================================== 
2016/03/28 12:26:45 - Message 
------------------------------------------------------------------------------- 
2016/03/28 12:26:45 - Message 
2016/03/28 12:26:45 - Message 
Message 
2016/03/28 12:26:45 - Message 
2016/03/28 12:26:46 - Message 
2016/03/28 12:26:46 - Message 
2016/03/28 12:28:30 - Message 
2016/03/28 12:28:40 - Message 
2016/03/28 12:28:40 - Message 
2016/03/28 12:28:40 - Message 
------------------------------------------------------------------------------- 
2016/03/28 12:28:40 - Message 
===============================================================================""" 
#after testing replace StringIO(temp) to filename 
df = pd.read_csv(StringIO(temp), sep="\s+-\s+", names = ["Time", "Text"], engine = "python") 

df.Time = pd.to_datetime(df.Time, errors='coerce') 
df.dropna(subset=['Time'], inplace=True) 
print (df) 
        Time  Text 
1 2016-03-28 12:26:45 Message 
3 2016-03-28 12:26:45 Message 
4 2016-03-28 12:26:45 Message 
6 2016-03-28 12:26:45 Message 
7 2016-03-28 12:26:46 Message 
8 2016-03-28 12:26:46 Message 
9 2016-03-28 12:28:30 Message 
10 2016-03-28 12:28:40 Message 
11 2016-03-28 12:28:40 Message 
12 2016-03-28 12:28:40 Message 
14 2016-03-28 12:28:40 Message 
+0

위대한 작품. sep = "\ s + - \ s +"와 pd.to_datetime (df.Time, errors = 'coerce')을 설명 할 수 있습니까? 그 메시지는 시간 열에서 제거됩니까? 덕분에 – ukbaz

+1

'sep = "\ s + - \ s +"는 분리자가 여러 개의 공백을 가지고 있고 그 뒤에 여러개의 공백이 있음을 의미합니다. 그리고 매개 변수'errors = 'coerce'를 추가하면 구문 분석 할 수없는 모든 데이터는 NaT로 대체됩니다 (datetime의 경우 NaN입니다). 그래서 마지막으로 컬럼 시간에'NaT' 값이있는 모든 행을 dropna 만 필요로합니다. – jezrael

2
import pandas as pd 

infile = "test.txt" #this is your file 

df = pd.DataFrame(columns=['Time','Text']) 

with open(infile, "r") as inf: 
    for i, line in enumerate(inf): 
     line = line.strip() 
     if line.startswith("-") or line.startswith("="): 
      pass 
     else: 
      if len(line.split("-")) > 1: 
       df.loc[i] = pd.Series({'Time':line.split("-")[0], 'Text':line.split("-")[1]}) 

inf.close() 

내가 확실하지 오전하지만 당신이 PD의 시간 형식으로 변환 된 시간 열을 원하는 경우 : @jezrael의 아주 좋은 솔루션더 긴 대안은 다음과 같다. 그렇다면 그럼 그냥 추가 :

df.Time = pd.to_datetime(df.Time)