无法将字符串转换为浮点'。'

时间:2021-03-17 17:03:52

标签: python arrays pandas numpy jupyter-notebook

我在 python 中生成了 2 列,我将它们转换为 np 数组,并设法将它们保存在一个新文件中。

fi = np.array([co,pred[40]])
fi=fi.T
np.savetxt("Pred_40.dat", fi, delimiter=" ")

现在我想创建一个内部函数来读取我的新文件。我做了,但我得到一个错误告诉我:无法将字符串转换为浮点'。'

def open_vmodel(vmodel_file,n_lag):
  list_ = []
  index = []
  vargplot = open(vmodel_file)
  for i in range(n_lag):
      dm = vargplot.readline()
      list_.append(list(map(float,dm))) 
  result = pd.DataFrame(list_)
  result.columns = ['Lag Distance','Variogram Value']
  istart = 0

      
  return pd.DataFrame(result)
vmodel_df = open_vmodel("Pred_40.dat",n_lag=1)

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:1)

我很确定 list(map(float, dm)) 行是错误的。它尝试将 dm 的每个字符解析为一个数字,因此当它尝试解析 '.' 时。作为一个数字,它失败了。也许尝试类似 list(map(float, dm.split()))

答案 1 :(得分:0)

你能用 dm = vargplot.readline().replace(".","") 吗?有一个点,所以也许它会解决您的问题。

答案 2 :(得分:0)

也许是本地化的问题,因为有些地区使用逗号而不是点来表示小数位。当您强制转换为浮点数时,其中一个数字可能类似于 0.2,而 Python 可能需要 0,2

import locale
locale.setlocale(locale.LC_NUMERIC,"C")

这会将数字格式设置为标准格式,它将接受 0.5 而不是 0,5

答案 3 :(得分:0)

使用您的文件示例(来自评论):

In [218]: txt="""0.000000000000000000e+00 0.000000000000000000e+00 
     ...: 0.000000000000000000e+00 0.000000000000000000e+00 
     ...: 1.000000000000000000e+01 5.626957416534423828e-01"""

In [220]: txt = txt.splitlines()
In [221]: txt
Out[221]: 
['0.000000000000000000e+00 0.000000000000000000e+00 ',
 '0.000000000000000000e+00 0.000000000000000000e+00 ',
 '1.000000000000000000e+01 5.626957416534423828e-01']

您的地图对一行的所有字符进行迭代:

In [222]: list(map(float, txt[0]))
Traceback (most recent call last):
  File "<ipython-input-222-47473c6c14f7>", line 1, in <module>
    list(map(float, txt[0]))
ValueError: could not convert string to float: '.'

In [223]: list(txt[0])[:10]
Out[223]: ['0', '.', '0', '0', '0', '0', '0', '0', '0', '0']

但是如果您首先按照https://stackoverflow.com/a/66678555/901925

的建议在空间上分割线
In [224]: list(map(float, txt[0].split()))
Out[224]: [0.0, 0.0]

或者对于几行(我更喜欢列表理解而不是地图):

In [225]: res = []
     ...: for dm in txt:
     ...:     res.append([float(i) for i in dm.split()])
     ...: 
In [226]: res
Out[226]: [[0.0, 0.0], [0.0, 0.0], [10.0, 0.5626957416534424]]