我正在使用的数据可以在以下要点中找到,
看起来像:
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