使用loadtxt(numpy)读取缺失数据的文件
当我尝试用下面的代码读取数据时:
loadtxt('RSTN')
我遇到了一个错误。
然后我试着用下面的代码来补全缺失的数据:
genfromtxt('RSTN',delimiter=' ')
但是我又遇到了这个错误:
第31112行(得到7列而不是8列)
我想用nan
或者类似的东西来填补这些缺失的数据。
我在一个名为RSTN
的ascii文件中有这样的数据:
20120127165126 19 42 54 91 113 147 188 284
20120127165127 19 42 54 91 113 147 188 284
20120127165128 19 42 54 90 113 147 188 284
20120127165129 19 42 54 90 113 147 188 284
20120127165130 19 42 54 88 107 131 155 235
20120127165131 19 42 54 72 79 79 92 154
20120127165132 19 42 54 45 43 42 50 97
20120127165133 19 42 54 24 21 21 25 65
20120127165134 19 42 54 11 8 9 12 46
20120127165135 19 42 54 5 2 3 7 35
20120127165136 18 42 54 2 0 1 4 29
20120127165137 19 42 54 0 0 2 25
20120127165138 19 42 53 0 0 1 22
20120127165139 19 42 54 0 0 1 19
20120127165140 19 42 54 0 0 0 17
20120127165141 19 42 54 0 0 0 14
20120127165142 19 42 54 0 0 0 14
20120127165143 19 42 54 0 0 0 14
20120127165144 19 42 54 0 0 13
20120127165145 19 42 54 0 0 14
20120127165146 19 42 54 0 0 0 14
20120127165147 19 42 54 0 0 1 15
20120127165148 19 42 54 0 0 1 15
20120127165149 19 42 54 0 0 1 15
20120127165150 20 42 53 0 1 15
20120127165151 20 42 53 0 1 17
20120127165152 20 42 53 0 1 17
20120127165153 19 42 53 0 0 1 17
20120127165154 20 42 53 0 1 17
20120127165155 20 42 53 0 1 17
20120127165156 20 42 53 0 0 1 17
20120127165157 19 42 54 0 0 1 17
20120127165158 19 42 55 0 0 1 17
20120127165159 19 42 55 0 0 1 17
20120127165200 20 42 56 0 0 1 17
20120127165201 21 42 56 0 0 1 17
当我执行这个操作时:
from pandas import *
data=read_fwf('26JAN12.K7O', colspecs='infer', header=None)
我又遇到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 429, in read_fwf
return _read(filepath_or_buffer, kwds)
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 198, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 479, in __init__
self._make_engine(self.engine)
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 592, in _make_engine
self._engine = klass(self.f, **self.options)
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 1954, in __init__
PythonParser.__init__(self, f, **kwds)
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 1237, in __init__
self._make_reader(f)
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 1957, in _make_reader
self.data = FixedWidthReader(f, self.colspecs, self.delimiter)
File "C:\Anaconda\lib\site-packages\pandas\io\parsers.py", line 1933, in __init__
raise AssertionError()
AssertionError
2 个回答
0
我之前也遇到过类似的问题,就是从一个用制表符分隔的文件中读取数据,但有些数据缺失。如果你能把数据整理成制表符分隔的格式,像下面这样就可以正常工作:
import pandas as pd
df = pd.read_csv('RSTN', sep='\t', header = None)
1
如果你有pandas这个库,你可以用pd.read_fwf
来解析数据:
import pandas as pd
df = pd.read_fwf('data', colspecs='infer', header=None, parse_dates=[[0]])
print(df)
这样会得到
0 1 2 3 4 5 6 7 8
0 2012-01-27 16:51:26 19 42 54 91 113 147 188 284
1 2012-01-27 16:51:27 19 42 54 91 113 147 188 284
...
11 2012-01-27 16:51:37 19 42 54 0 NaN 0 2 25
12 2012-01-27 16:51:38 19 42 53 0 NaN 0 1 22
13 2012-01-27 16:51:39 19 42 54 0 NaN 0 1 19
[36 rows x 9 columns]
或者,感谢DSM的帮助,使用np.genfromtxt
也可以解析固定宽度的数据,只需要把宽度的列表传给delimiter
参数:
import numpy as np
np.set_printoptions(formatter={'float':'{:g}'.format})
arr = np.genfromtxt('data', delimiter=[18]+[7]*8)
print(arr)
这样会得到
[[2.01201e+13 19 42 54 91 113 147 188 284]
[2.01201e+13 19 42 54 91 113 147 188 284]
[2.01201e+13 19 42 54 90 113 147 188 284]
...
[2.01201e+13 19 42 54 0 nan 0 2 25]
[2.01201e+13 19 42 53 0 nan 0 1 22]
[2.01201e+13 19 42 54 0 nan 0 1 19]
...]