【问题标题】:Reading data from log file in Python在 Python 中从日志文件中读取数据
【发布时间】:2021-03-25 13:04:04
【问题描述】:

我正在尝试从 Python 中的日志文件中读取数据。假设文件名为 data.log。 文件内容如下:

# Performance log
# time, ff, T vector, dist, windnorth, windeast
0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000
1.00000000,3.02502604,343260.68655952,384.26845401,-7.70828175,-0.45288215
2.00000000,3.01495320,342124.21684440,767.95286901,-7.71506536,-0.45123853
3.00000000,3.00489957,340989.57100678,1151.05303883,-7.72185550,-0.44959182

我想获取最后两列并将它们放入两个单独的列表中,这样我就会得到如下输出:

list1 = [-7.70828175, -7.71506536, -7.71506536]

list2 = [-0.45288215, -0.45123853, -0.44959182]

我尝试使用以下代码读取数据,如下所示,但我没有单独的列和行,而是得到一整列和三行作为回报。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

file = open('data.log', 'r')

df = pd.read_csv('data.log', sep='\\s+')

df = list(df)

print (df[0])

有人可以指出我必须在我的代码中调整什么以获得上述所需的输出吗?

提前致谢!

【问题讨论】:

  • 你在your other question接受的答案有什么问题?
  • 这能回答你的问题吗? Reading log files in python
  • 它有效,但我正在尝试以不同的方式使用熊猫作为解决方案
  • df = pd.read_csv('data.log', skiprows=3, header=None) 使用skirows,因为您不希望该行全为0

标签: python pandas dataframe


【解决方案1】:
import pandas as pd 
df = pd.read_csv('sample.txt', skiprows=3, header=None, 
                 names=['time', 'ff', 'T vector', 'dist', 'windnorth', 'windeast'])
spam = list(df['windeast'])
print(spam)
# store a specific column in a list
df['wind_diff'] = df.windnorth - df['windeast'] # two different ways to access columsn
print(df)
print(df['wind_diff'])

输出

[-0.45288215, -0.45123853, -0.44959182]
   time        ff       T vector         dist  windnorth  windeast  wind_diff
0   1.0  3.025026  343260.686560   384.268454  -7.708282 -0.452882  -7.255400
1   2.0  3.014953  342124.216844   767.952869  -7.715065 -0.451239  -7.263827
2   3.0  3.004900  340989.571007  1151.053039  -7.721856 -0.449592  -7.272264
0   -7.255400
1   -7.263827
2   -7.272264
Name: wind_diff, dtype: float64

注意,要在 matplotlib 中创建绘图,您可以直接使用 pandas.Series,无需将其存储在列表中。

【讨论】:

  • 嗨@buran,感谢这个解决方案,我确实想在之前将它存储在一个列表中,因为我确实需要在绘图之前对这些值进行一些操作。
  • 嗨@buran,假设我有关于此代码的后续问题,我应该问一个新问题还是可以在评论中提问?
  • 您也可以在绘图之前操作 df 并更改原始系列或存储为新列(如果您愿意)。你有什么问题?它与我的答案有关(即使其更清楚)还是与其他事物有关?
  • 好吧,这确实是件好事。由于我提到的操作与此有关:我想从第 4 列的第一个值中减去第 5 列的第一个值以获得这两者之间的差异。我可以立即使用 df 进行此操作以准备好进行绘图吗?
  • df['diff'] = df[5]-df[4] 这将在 DataFrame 中创建新列 diff。如果您愿意,您可以继续按索引引用列,但总体而言,最好使用列名(包括原始列),因为它使您的代码清晰 - 即您知道每列是什么。
【解决方案2】:

错误出现在sep 属性中。如果您删除它,它将使用您需要的默认值(逗号):

例如

>>> import pandas as pd
>>> import numpy as np
>>> file = open('data.log', 'r')
>>> df = pd.read_csv('data.log')  # or use sep=','
>>> df = list(df)
>>> df[0]
'1.00000000'
>>> df[5]
'-0.45288215'

另外使用skiprows 来获取标题。

【讨论】:

  • 嗨@ppanero,感谢这个解决方案!但是我想知道为什么我在使用 df[5] 时只得到第一行的值,我不应该得到整个最后一列吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2014-06-03
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多