NumPy genfromxt TypeError: data type not understood error
NumPy genfromxt TypeError: data type not understood error
我想阅读此文件 (test.txt)
01.06.2015;00:00:00;0.000;0;-9.999;0;8;0.00;18951;(SPECTRUM)ZERO(/SPECTRUM)
01.06.2015;00:01:00;0.000;0;-9.999;0;8;0.00;18954;(SPECTRUM)ZERO(/SPECTRUM)
01.06.2015;00:02:00;0.000;0;-9.999;0;8;0.00;18960;(SPECTRUM)ZERO(/SPECTRUM)
01.06.2015;09:23:00;0.327;61;25.831;39;29;0.18;19006;01.06.2015;09:23:00;0.327;61;25.831;39;29;0.18;19006;(SPECTRUM);;;;;;;;;;;;;;1;1;;;1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1;;;;;;;;;;;;(/SPECTRUM)
01.06.2015;09:24:00;0.000;0;-9.999;0;29;0.00;19010;(SPECTRUM)ZERO(/SPECTRUM)
...我使用 numpy 函数 genfromtxt() 进行了尝试(请参阅下面的代码摘录)。
import numpy as np
col_names = ["date", "time", "rain_intensity", "weather_code_1", "radar_ref", "weather_code_2", "val6", "rain_accum", "val8", "val9"]
types = ["object", "object", "float", "uint8", "float", "uint8", "uint8", "float", "uint8","|S10"]
# Read in the file with np.genfromtxt
mydata = np.genfromtxt("test.txt", delimiter=";", names=col_names, dtype=types)
现在当我执行代码时出现以下错误 -->
raise ValueError(errmsg)ValueError: Some errors were detected !
Line #4 (got 79 columns instead of 10)
现在我认为困难来自最后一列 (val9),其中有很多 ;;;;;;;
很明显最后一列的分隔符和符号;
是一样的!
我怎样才能不出错地读取文件,也许可以跳过最后一列,或者只替换最后一列中的;
?
invalid_raise : bool, optional
If True, an exception is raised if an inconsistency is detected in the
number of columns. If False, a warning is emitted and the offending
lines are skipped.
mydata = np.genfromtxt("test.txt", delimiter=";", names=col_names, dtype=types, invalid_raise = False)
请注意,我已更正您的代码中的错误(定界符拼写错误,types
列表在函数调用中称为 dtypes
)
编辑:从你的评论来看,我发现我有点误解了。你的意思是你想跳过最后一个 列 而不是最后一个 行 .
看看下面的代码。我定义了一个生成器,它只 returns 每行的前十个元素。这将允许 genfromtxt()
无误地完成并且您现在从所有行中获得第 3 列。
不过请注意,您仍然会丢失一些数据,如果您仔细观察,您会发现问题行实际上是两行连接在一起的垃圾,而其他行有 ZERO
。所以你仍然会失去第二条线。您也许可以修改生成器以解析每一行并以不同方式处理它,但我会把它留作一个有趣的练习:)
import numpy as np
def filegen(filename):
with open(filename, 'r') as infile:
for line in infile:
yield ';'.join(line.split(';')[:10])
col_names = ["date", "time", "rain_intensity", "weather_code_1", "radar_ref", "weather_code_2", "val6", "rain_accum", "val8", "val9"]
dtypes = ["object", "object", "float", "uint8", "float", "uint8", "uint8", "float", "uint8","|S10"]
# Read in the file with np.genfromtxt
mydata = np.genfromtxt(filegen('temp.txt'), delimiter=";", names=col_names, dtype = dtypes)
输出
[('01.06.2015', '00:00:00', 0.0, 0, -9.999, 0, 8, 0.0, 7, '(SPECTRUM)')
('01.06.2015', '00:01:00', 0.0, 0, -9.999, 0, 8, 0.0, 10, '(SPECTRUM)')
('01.06.2015', '00:02:00', 0.0, 0, -9.999, 0, 8, 0.0, 16, '(SPECTRUM)')
('01.06.2015', '09:23:00', 0.327, 61, 25.831, 39, 29, 0.18, 62, '01.06.2015')
('01.06.2015', '09:24:00', 0.0, 0, -9.999, 0, 29, 0.0, 66, '(SPECTRUM)')]
usecols
可用于忽略多余的分隔符,例如
In [546]: np.genfromtxt([b'1,2,3',b'1,2,3,,,,,,'], dtype=None,
delimiter=',', usecols=np.arange(3))
Out[546]:
array([[1, 2, 3],
[1, 2, 3]])
我想阅读此文件 (test.txt)
01.06.2015;00:00:00;0.000;0;-9.999;0;8;0.00;18951;(SPECTRUM)ZERO(/SPECTRUM)
01.06.2015;00:01:00;0.000;0;-9.999;0;8;0.00;18954;(SPECTRUM)ZERO(/SPECTRUM)
01.06.2015;00:02:00;0.000;0;-9.999;0;8;0.00;18960;(SPECTRUM)ZERO(/SPECTRUM)
01.06.2015;09:23:00;0.327;61;25.831;39;29;0.18;19006;01.06.2015;09:23:00;0.327;61;25.831;39;29;0.18;19006;(SPECTRUM);;;;;;;;;;;;;;1;1;;;1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1;;;;;;;;;;;;(/SPECTRUM)
01.06.2015;09:24:00;0.000;0;-9.999;0;29;0.00;19010;(SPECTRUM)ZERO(/SPECTRUM)
...我使用 numpy 函数 genfromtxt() 进行了尝试(请参阅下面的代码摘录)。
import numpy as np
col_names = ["date", "time", "rain_intensity", "weather_code_1", "radar_ref", "weather_code_2", "val6", "rain_accum", "val8", "val9"]
types = ["object", "object", "float", "uint8", "float", "uint8", "uint8", "float", "uint8","|S10"]
# Read in the file with np.genfromtxt
mydata = np.genfromtxt("test.txt", delimiter=";", names=col_names, dtype=types)
现在当我执行代码时出现以下错误 -->
raise ValueError(errmsg)ValueError: Some errors were detected !
Line #4 (got 79 columns instead of 10)
现在我认为困难来自最后一列 (val9),其中有很多 ;;;;;;;
很明显最后一列的分隔符和符号;
是一样的!
我怎样才能不出错地读取文件,也许可以跳过最后一列,或者只替换最后一列中的;
?
invalid_raise : bool, optional
If True, an exception is raised if an inconsistency is detected in the number of columns. If False, a warning is emitted and the offending lines are skipped.
mydata = np.genfromtxt("test.txt", delimiter=";", names=col_names, dtype=types, invalid_raise = False)
请注意,我已更正您的代码中的错误(定界符拼写错误,types
列表在函数调用中称为 dtypes
)
编辑:从你的评论来看,我发现我有点误解了。你的意思是你想跳过最后一个 列 而不是最后一个 行 .
看看下面的代码。我定义了一个生成器,它只 returns 每行的前十个元素。这将允许 genfromtxt()
无误地完成并且您现在从所有行中获得第 3 列。
不过请注意,您仍然会丢失一些数据,如果您仔细观察,您会发现问题行实际上是两行连接在一起的垃圾,而其他行有 ZERO
。所以你仍然会失去第二条线。您也许可以修改生成器以解析每一行并以不同方式处理它,但我会把它留作一个有趣的练习:)
import numpy as np
def filegen(filename):
with open(filename, 'r') as infile:
for line in infile:
yield ';'.join(line.split(';')[:10])
col_names = ["date", "time", "rain_intensity", "weather_code_1", "radar_ref", "weather_code_2", "val6", "rain_accum", "val8", "val9"]
dtypes = ["object", "object", "float", "uint8", "float", "uint8", "uint8", "float", "uint8","|S10"]
# Read in the file with np.genfromtxt
mydata = np.genfromtxt(filegen('temp.txt'), delimiter=";", names=col_names, dtype = dtypes)
输出
[('01.06.2015', '00:00:00', 0.0, 0, -9.999, 0, 8, 0.0, 7, '(SPECTRUM)')
('01.06.2015', '00:01:00', 0.0, 0, -9.999, 0, 8, 0.0, 10, '(SPECTRUM)')
('01.06.2015', '00:02:00', 0.0, 0, -9.999, 0, 8, 0.0, 16, '(SPECTRUM)')
('01.06.2015', '09:23:00', 0.327, 61, 25.831, 39, 29, 0.18, 62, '01.06.2015')
('01.06.2015', '09:24:00', 0.0, 0, -9.999, 0, 29, 0.0, 66, '(SPECTRUM)')]
usecols
可用于忽略多余的分隔符,例如
In [546]: np.genfromtxt([b'1,2,3',b'1,2,3,,,,,,'], dtype=None,
delimiter=',', usecols=np.arange(3))
Out[546]:
array([[1, 2, 3],
[1, 2, 3]])