【问题标题】:Which is a good way to open a 'complicated' txt file in python这是在python中打开“复杂”txt文件的好方法
【发布时间】:2015-07-13 20:49:35
【问题描述】:

我有一个 txt 文件,格式如下(简体):

date                 this that other
2007-05-25 11:00:00  10   20   30
2007-05-25 11:10:00  15   18   30
2007-05-25 11:20:00  10   27   30
2007-05-25 11:30:00  20   35   30
2007-05-25 11:50:00  30   20   
2007-05-25 12:00:00  30   13   
2007-05-25 12:10:00  30   13   

第一个原始字符串是定义它们上方的列的字符串。第一列很明显是时间。还可以观察到一些值丢失。我不想删除缺少某些值的行。因为我想稍后对这些数据进行一些计算,所以我想使用 numpy 通过 numpy.loadtxt 导入该数据:

data = numpy.loadtxt('data.txt')

由于第一个原始数据,它会给出错误ValueError: could not convert string to float: b'date'。使用:

data = numpy.genfromtxt('data.txt')

为许多行给出错误Line #51028 (got 38 columns instead of 37),这是因为缺少某些值。我应该尝试什么?

【问题讨论】:

    标签: python numpy genfromtxt


    【解决方案1】:

    Pandas 是一个基于 NumPy 的库。除此之外,它还可以很好地处理不完整的数据。

    你应该可以通过一个简单的install pandas

    $ pip install pandas
    

    我将您的示例文件保存在http://pastebin.com/NuNaTW9n 下,并用制表符替换了列之间的空格。

    >>> import pandas as pd
    >>> from urllib import urlopen
    >>> df = pd.read_csv(urlopen("http://pastebin.com/raw.php?i=NuNaTW9n"), sep='\t')
    >>> df
                      date  this  that  other
    0  2007-05-25 11:00:00    10    20     30
    1  2007-05-25 11:10:00    15    18     30
    2  2007-05-25 11:20:00    10    27     30
    3  2007-05-25 11:30:00    20    30    NaN
    4  2007-05-25 11:50:00    30    20    NaN
    5  2007-05-25 12:00:00    30    13    NaN
    6  2007-05-25 12:10:00    30    13    NaN
    

    一旦你掌握了一个数据框,你就可以开始探索你的数据了:

    >>> df["this"].sum()
    145
    
    >>> df["that"].mean()
    20.142857142857142
    
    >>> df[df["that"] < 20]["date"]
    1    2007-05-25 11:10:00
    5    2007-05-25 12:00:00
    6    2007-05-25 12:10:00
    

    默认情况下,pandas 会尝试为您的值猜测最佳数据类型(例如,它会猜测 df["that"] 应该是 int64),但您可以通过将 dtype 参数传递给 @ 来控制此行为987654324@.

    【讨论】:

      【解决方案2】:

      要使用 genfromtxt 处理这样的缺失值,您可以使用带有字段宽度列表的 delimiter 参数,因为您的文件具有固定宽度的字段:

      In [2]: a = np.genfromtxt('test.txt', delimiter=[19,4,5,5], skip_header=1)
      

      在你的例子中。但是,您需要正确设置 dtype 或使用转换器函数来处理日期/时间字段。例如:

      In [3]: a = np.genfromtxt('test.txt', delimiter=[19,4,5,5], skip_header=1,
                                dtype=np.dtype([('date', 'datetime64[s]'),
                                                ('this', int), ('that', int),
                                                ('other', int)])
                               )
      
      In [4]: a
      Out[4]: array([(datetime.datetime(2007, 5, 25, 15, 0), 10, 20, 30),
         (datetime.datetime(2007, 5, 25, 15, 10), 15, 18, 30),
         (datetime.datetime(2007, 5, 25, 15, 20), 10, 27, 30),
         (datetime.datetime(2007, 5, 25, 15, 30), 20, 35, 30),
         (datetime.datetime(2007, 5, 25, 15, 50), 30, 20, -1),
         (datetime.datetime(2007, 5, 25, 16, 0), 30, 13, -1),
         (datetime.datetime(2007, 5, 25, 16, 10), 30, 13, -1)], 
        dtype=[('date', '<M8[s]'), ('this', '<i8'), ('that', '<i8'), ('other', '<i8')])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-13
        • 2017-05-13
        • 2020-10-12
        • 2010-11-25
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        相关资源
        最近更新 更多