使用.csv文件将字符串转换为浮点数并生成直方图

时间:2017-02-01 23:43:11

标签: python csv numpy matplotlib python-3.5

我已经使用.cvs文件从数据中生成直方图。它有类似这样的数据

    102.919 103.36
    102.602 103.05
    104.106 104.57
    108.791 109.26
    104.045 104.52
    104.324 104.77
    105.106 105.57
    102.619 103.08
    102.124 102.6

这是我写的代码

# histplot.py
        import numpy as np
        import matplotlib.pyplot as plt
        import csv

        with open('datafile.csv', 'rU') as data:
            reader = csv.DictReader(data, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC)
            for line in reader:
                t = float(line)
                data.append(t)
            reader.close()

# generate the histogram
        hist, bin_edges=np.histogram(data, bins=50, range=[80,135])


# generate histogram figure
        plt.hist(data, bin_edges)
        plt.savefig('chart_file', format="pdf")
        plt.show()

运行此代码会给我一个错误 ValueError:无法将字符串转换为float:' 102.919,103.36' 有人可以帮助我提供一些关于使用csv文件将字符串转换为浮点数的想法。 先感谢您。

1 个答案:

答案 0 :(得分:0)

首先,with open('datafile.csv', 'rU') as data:表示您获取data作为文件的文件句柄。您可以将此文件句柄用作可迭代但不能向其追加任何内容。

第二个csv.DictReader提供对字典的访问。在这种情况下,我建议使用csv.reader,以list的形式访问数据。

第三,你不能将整个line,可能是字典或列表转换为浮点数。您只能使用列表中的单个元素执行此操作。 (这是错误的来源。)转换为浮点数甚至是不必要的,因为读者已经处理了这一点。

现在,您可以简单地将元素逐行附加到最初为空的列表,并将此列表提供给直方图函数。

import numpy as np
import matplotlib.pyplot as plt
import csv

data = [] #create empty list
with open('datafile.csv', 'rU') as f:
    reader = csv.reader(f, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC)
    for line in reader:
        data.extend(line)

# generate the histogram
hist, bin_edges=np.histogram(data, bins=50, range=[80,135])


# generate histogram figure
plt.hist(data, bin_edges)
#plt.savefig('chart_file', format="pdf")
plt.show()

我要提一下,使用numpy.loadtxt可以更简单的方式完成整个数据阅读。
此外,如果不需要进行进一步的数据处理,可以简化绘制直方图。

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt('datafile.csv').flatten()

plt.hist(data, bins=50, range=[80,135])

plt.show()