如何在Python中打开一个“复杂”的文本文件是一个好的方法?

4

我有一个文本文件,格式如下(简化版):

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

许多行会出现错误第51028行(得到了38列而不是37列),这是因为某些值缺失。我应该尝试什么?

2个回答

5

Pandas 是一个基于 NumPy 的库。它被设计用来更好地处理不完整的数据,除此之外还有许多其他功能。

你可以通过简单的以下命令安装 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),但您可以通过向read_csv传递dtype参数来控制此行为。


3

要使用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')])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接