这是在 python 中打开 'complicated' txt 文件的好方法
Which is a good way to open a 'complicated' txt file in python
我有一个 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)
,这是因为缺少某些值。我应该尝试什么?
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
参数传递给 read_csv
.
的行为
要使用 genfromtxt
处理这样的缺失值,您可以使用带有字段宽度列表的 delimiter
参数,因为您的文件具有固定宽度的字段:
In [2]: a = np.genfromtxt('test.txt', delimiter=[19,4,5,5], skip_header=1)
在你的例子中。但是,您需要正确设置 dtype
或使用转换器函数来处理 date/time 字段。例如:
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')])
我有一个 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)
,这是因为缺少某些值。我应该尝试什么?
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
参数传递给 read_csv
.
要使用 genfromtxt
处理这样的缺失值,您可以使用带有字段宽度列表的 delimiter
参数,因为您的文件具有固定宽度的字段:
In [2]: a = np.genfromtxt('test.txt', delimiter=[19,4,5,5], skip_header=1)
在你的例子中。但是,您需要正确设置 dtype
或使用转换器函数来处理 date/time 字段。例如:
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')])