使用Python导入分隔数据和分页数据的最佳方法

时间:2014-04-10 15:36:43

标签: python regex csv numpy pandas

我有一些数据文件,它们常常作为一种分页形式重复它们的4个标题行。因此,我不能使用自动导入方法,因为这些额外的标题行会妨碍。我可以逐行阅读,检查每一行是否为标题,只检查标题的第一行并跳过以下3行,或者只是使用匹配6个连续数据列的正则表来解析整个文件,这将是匹配每个数据行并轻松跳过标题。

我想知道是否有办法用pandas,numpy,csv库或其他一些我没想过的技巧导入数据。

虽然正则表达式非常快,但我还是要进行一系列批量处理和交易研究,我希望我的后期处理能够快速处理数十个或数百个文件以显示比较。

我刚刚意识到每页的行数似乎总是55,所以也许一些简单的计数会起作用,或模数 - 无论如何我会问这个问题,因为我很好奇是否有人找到了一个交易库重复的标题或像这样的“分块”数据。

我将为固定长度的页面添加基于模数的解决方案作为答案......

感谢您的任何其他想法!

编辑:这是格式的一个例子......实际上每页有55行数据,但为了简洁,我将其限制为5行。并且,是的,每个标题开头的第一列中有一个1,因此也可以使用。我很确定1曾经是旧版本代码中的FormFeed角色,这对于在大型机上运行的基于FORTRAN的代码中的旧学校分页是有意义的。

1  DATE: 03/10/14      Analysis Title                                                             

     TIME    PRESSURE      MDOT       THRUST        PT        AB           D
      SEC      PSIA      LBM/SEC       LBF         PSIA      IN^2         IN
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
   11.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
   11.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
1  DATE: 03/10/14      Analysis Title                                                             

     TIME    PRESSURE      MDOT       THRUST        PT        AB           D
      SEC      PSIA      LBM/SEC       LBF         PSIA      IN^2         IN
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
1  DATE: 03/10/14      Analysis Title                                                             

     TIME    PRESSURE      MDOT       THRUST        PT        AB           D
      SEC      PSIA      LBM/SEC       LBF         PSIA      IN^2         IN
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050
    1.769    1372.02      1220.0     363622.4    1332.78    60361.37     0.050

1 个答案:

答案 0 :(得分:0)

这是每页固定数量的列和固定行的解决方案。我以为我会继续把它包装成一个类,因为那是我如何使用它(需要加载,处理,绘图,保存到其他格式等等所以一个类是有意义的) 。使用模数来检查我认为是否优雅的标题行。

import os
import numpy as np


class Data(object):
    def __init__(self):
        super(Data, self).__init__()
        self.time = None
        self.pressure = None

    def load(self, filename):

        #Data Properties
        cols = 7
        lines_per_page = 59
        header_lines = 4

        #Initialize Data
        data = np.empty([0, cols])

        #Open the file
        with open(filename, 'r') as f:

            #Traverse the file's lines
            for i, line in enumerate(f.readlines()):

                #Check whether this is a header line
                if i % lines_per_page >= header_lines:

                    #Split line into columns, convert to float, convert to numpy array, shape as a row
                    linedata = np.array(map(float, line.split())).reshape(1, cols)

                    #Add the row to the bottom of the data
                    data = np.vstack([data, linedata])

        self.time = data[:, 0]
        self.pressure = data[:, 1]