numpy.genfromtxt ,列之间的不均匀空格会导致 dtype 错误吗?



我正在使用的数据可以在以下要点中找到,

看起来像:

07-11-2018 18:34:35 -2.001   5571.036 -1.987
07-11-2018 18:34:50 -1.999   5570.916 -1.988

Jupyter 笔记本中的代码和输出的图像

呼叫时

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 生成看起来像元组的数组,而不是 2D 数组——为什么?

注意:数据输出的第三列已被视为指定的 dtype 以外的其他内容。

输出应该是-2.001的,但它是-2.001e+00

注意:请注意,第五列具有相同的输入格式和 dtype 指定,但是在 genfromtxt 函数期间没有发生数据转换...

我能找到的"bathtemp"和"SBEtemp"之间的唯一区别是"bathtemp"列后面有两个额外的空格......

但是,根据numpy.genfromtxt IO文档,这无关紧要,因为连续空格应自动被视为分隔符。

分隔符:str、int 或序列,可选 用于分隔值的字符串。默认情况下,任何连续的空格都充当分隔符。整数或整数序列也可以作为每个字段的宽度提供。

"bathtemp"列后面的额外空格是否会导致错误?如果是这样,我该如何解决它?

使用您的示例:

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')])

并使用您的 dtype:

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值(您没有显示(更接近于零。

由于skipinitialspace=True可选输入,我能够通过切换到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

相关内容

  • 没有找到相关文章

最新更新