numpy.genfromtxt ,列之间的不均匀空间是否会导致 dtype 错误?
numpy.genfromtxt , are uneven spaces between columns causing dtype errors?
我正在处理的数据可以在 gist,
找到
看起来像:
07-11-2018 18:34:35 -2.001 5571.036 -1.987
07-11-2018 18:34:50 -1.999 5570.916 -1.988
image of code and output in Jupyter Notebook
调用时
TB_CAL_array = np.genfromtxt('calbath_data/TB118192.TXT',
skip_header = 10,
dtype = ([("date", "<U10"), ("time","<U8"), ("bathtemp", "<f8"),
("SBEfreq", "<f8"), ("SBEtemp", "<f8")])
)
数组的输出是:
array([('07-11-2018', '18:34:35', -2.001e+00, 5571.036, -1.987),
('07-11-2018', '18:34:50', -1.999e+00, 5570.916, -1.988),
数据作为元组的结构化 ndarray 输出,并且是非同构数组,因为它同时包含字符串和浮点数。 numpy.genfromtxt produces array of what looks like tuples, not a 2D array—why?
注意:第三列数据输出已被视为指定数据类型以外的内容。
输出应该是 -2.001
但实际上是 -2.001e+00
注意:请注意,第五列具有相同的输入格式和 dtype 名称,但是在 genfromtxt 函数期间没有发生数据转换...
我能找到的 "bathtemp" 和 "SBEtemp" 之间的唯一区别是 "bathtemp" 列之后有两个额外的空格...
但是基于 numpy.genfromtxt IO documentation 这应该无关紧要,因为连续的空格应该自动被视为分隔符。:
delimiter : str, int, or sequence, optional
用于分隔值的字符串。默认情况下,任何连续的空格都充当分隔符。也可以提供整数或整数序列作为每个字段的宽度。
是否是 "bathtemp" 列之后的多余空格导致了错误?如果是这样,我该如何解决?
由于 skipinitialspace=True 可选输入(参见此处 reference),我能够通过切换到 pd.read_csv 获得我正在寻找的输出:
skipinitialspace : bool, default False
跳过定界符后的空格。
输入
colnames = ['date', 'time', 'bathtemp', 'SBEfreq', 'SBEtemp']
TB_CAL = pd.read_csv("calbath_data/TB118192.CAL", header=None, skiprows=10, delimiter=" ", skipinitialspace=True, names=colnames )
输出
date time bathtemp SBEfreq SBEtemp
0 07-11-2018 18:34:35 -2.001 5571.036 -1.987
1 07-11-2018 18:34:50 -1.999 5570.916 -1.988
2 07-11-2018 18:35:06 -1.997 5571.058 -1.987
你的样本:
In [136]: txt="""07-11-2018 18:34:35 -2.001 5571.036 -1.987
...: 07-11-2018 18:34:50 -1.999 5570.916 -1.988"""
In [137]: np.genfromtxt(txt.splitlines(), dtype=None, encoding=None)
Out[137]:
array([('07-11-2018', '18:34:35', -2.001, 5571.036, -1.987),
('07-11-2018', '18:34:50', -1.999, 5570.916, -1.988)],
dtype=[('f0', '<U10'), ('f1', '<U8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8')])
和你的数据类型:
In [139]: np.genfromtxt(txt.splitlines(), dtype= ([("date", "<U10"), ("time","<U
...: 8"), ("bathtemp", "<f8"),
...: ("SBEfreq", "<f8"), ("SBEtemp", "<
...: f8")])
...: , encoding=None)
Out[139]:
array([('07-11-2018', '18:34:35', -2.001, 5571.036, -1.987),
('07-11-2018', '18:34:50', -1.999, 5570.916, -1.988)],
dtype=[('date', '<U10'), ('time', '<U8'), ('bathtemp', '<f8'), ('SBEfreq', '<f8'), ('SBEtemp', '<f8')])
-2.001e+00
等值与 -2.001
相同。 numpy
当值的范围足够宽或某些值太小而无法很好地显示时,选择使用科学记数法。
例如,如果我将其中一个值更改为更小的值:
In [140]: data = _
In [141]: data['bathtemp']
Out[141]: array([-2.001, -1.999])
In [142]: data['bathtemp'][1] *= 0.001
In [143]: data['bathtemp']
Out[143]: array([-2.001e+00, -1.999e-03])
-2.001
不变(显示样式除外)。
我的猜测是某些 bathtemp
值(您没有显示)更接近于零。
我正在处理的数据可以在 gist,
找到看起来像:
07-11-2018 18:34:35 -2.001 5571.036 -1.987
07-11-2018 18:34:50 -1.999 5570.916 -1.988
image of code and output in Jupyter Notebook
调用时
TB_CAL_array = np.genfromtxt('calbath_data/TB118192.TXT',
skip_header = 10,
dtype = ([("date", "<U10"), ("time","<U8"), ("bathtemp", "<f8"),
("SBEfreq", "<f8"), ("SBEtemp", "<f8")])
)
数组的输出是:
array([('07-11-2018', '18:34:35', -2.001e+00, 5571.036, -1.987),
('07-11-2018', '18:34:50', -1.999e+00, 5570.916, -1.988),
数据作为元组的结构化 ndarray 输出,并且是非同构数组,因为它同时包含字符串和浮点数。 numpy.genfromtxt produces array of what looks like tuples, not a 2D array—why?
注意:第三列数据输出已被视为指定数据类型以外的内容。
输出应该是 -2.001
但实际上是 -2.001e+00
注意:请注意,第五列具有相同的输入格式和 dtype 名称,但是在 genfromtxt 函数期间没有发生数据转换...
我能找到的 "bathtemp" 和 "SBEtemp" 之间的唯一区别是 "bathtemp" 列之后有两个额外的空格...
但是基于 numpy.genfromtxt IO documentation 这应该无关紧要,因为连续的空格应该自动被视为分隔符。:
delimiter : str, int, or sequence, optional 用于分隔值的字符串。默认情况下,任何连续的空格都充当分隔符。也可以提供整数或整数序列作为每个字段的宽度。
是否是 "bathtemp" 列之后的多余空格导致了错误?如果是这样,我该如何解决?
由于 skipinitialspace=True 可选输入(参见此处 reference),我能够通过切换到 pd.read_csv 获得我正在寻找的输出:
skipinitialspace : bool, default False 跳过定界符后的空格。
输入
colnames = ['date', 'time', 'bathtemp', 'SBEfreq', 'SBEtemp']
TB_CAL = pd.read_csv("calbath_data/TB118192.CAL", header=None, skiprows=10, delimiter=" ", skipinitialspace=True, names=colnames )
输出
date time bathtemp SBEfreq SBEtemp
0 07-11-2018 18:34:35 -2.001 5571.036 -1.987
1 07-11-2018 18:34:50 -1.999 5570.916 -1.988
2 07-11-2018 18:35:06 -1.997 5571.058 -1.987
你的样本:
In [136]: txt="""07-11-2018 18:34:35 -2.001 5571.036 -1.987
...: 07-11-2018 18:34:50 -1.999 5570.916 -1.988"""
In [137]: np.genfromtxt(txt.splitlines(), dtype=None, encoding=None)
Out[137]:
array([('07-11-2018', '18:34:35', -2.001, 5571.036, -1.987),
('07-11-2018', '18:34:50', -1.999, 5570.916, -1.988)],
dtype=[('f0', '<U10'), ('f1', '<U8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8')])
和你的数据类型:
In [139]: np.genfromtxt(txt.splitlines(), dtype= ([("date", "<U10"), ("time","<U
...: 8"), ("bathtemp", "<f8"),
...: ("SBEfreq", "<f8"), ("SBEtemp", "<
...: f8")])
...: , encoding=None)
Out[139]:
array([('07-11-2018', '18:34:35', -2.001, 5571.036, -1.987),
('07-11-2018', '18:34:50', -1.999, 5570.916, -1.988)],
dtype=[('date', '<U10'), ('time', '<U8'), ('bathtemp', '<f8'), ('SBEfreq', '<f8'), ('SBEtemp', '<f8')])
-2.001e+00
等值与 -2.001
相同。 numpy
当值的范围足够宽或某些值太小而无法很好地显示时,选择使用科学记数法。
例如,如果我将其中一个值更改为更小的值:
In [140]: data = _
In [141]: data['bathtemp']
Out[141]: array([-2.001, -1.999])
In [142]: data['bathtemp'][1] *= 0.001
In [143]: data['bathtemp']
Out[143]: array([-2.001e+00, -1.999e-03])
-2.001
不变(显示样式除外)。
我的猜测是某些 bathtemp
值(您没有显示)更接近于零。