使用loadtxt(numpy)读取缺失数据的文件

1 投票
2 回答
1385 浏览
提问于 2025-04-17 21:51

当我尝试用下面的代码读取数据时:

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]
...]

撰写回答