将虚线日志读入pandas数据帧

2024-05-21 03:01:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个棘手的日志文件,我想进入一个干净的数据流。日志格式如下:

===============================================================================
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
===============================================================================

日志按照上述模式继续,我的目标是拥有以下数据帧

^{pr2}$

我已经厌倦了解析'-'上的文件文件,创建了一个数据帧,并删除了虚线。在

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

然而,我得到了许多南专栏,任何帮助都是感激的


Tags: 文件数据textimportmessagepandasdfread
2条回答

我认为您可以使用^{}errors='coerce'来将错误数据替换为NaT和{a2}来删除NaT列中NaT的所有行:

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)  
^{pr2}$

对于@jezrael这个非常好的解决方案,一个更冗长的替代方案是:

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()

但我不确定您是否希望将Time列转换为pd Time格式。如果是,那么只需添加:

^{pr2}$

在剧本的结尾

相关问题 更多 >