2016-10-31 4 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 
=============================================================================== 

ログは上記のパターンで続き、私の目標は以下のデータフレームです。

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

私はファイルファイルを ' - 'で解析し、Dataframeを作成して破線を削除するのに疲れました。私が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

これらはすべてのセクションの最初と最後にあります。したがって、ログファイルにはダブルダッシュファイルのインスタンスが多数存在します。ログファイルは投稿で指定したパターンに従うため、このパターンはファイル内で複数回発生します@jezrael – 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の非常に素晴らしいソリューションへAより長い選択肢は次のとおりです。そうならば、単に追加:

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

スクリプトの末尾に

関連する問題