【问题标题】:Coverting string to floats using .csv file and generating Histogram使用 .csv 文件将字符串转换为浮点数并生成直方图
【发布时间】:2017-06-18 22:00:10
【问题描述】:

我一直使用 .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: could not convert string to float: '102.919,103.36' 有人可以帮我提供一些关于使用 csv 文件将字符串转换为浮点数的想法。 先感谢您。

【问题讨论】:

    标签: python csv numpy matplotlib python-3.5


    【解决方案1】:

    首先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()
    

    【讨论】:

    • 在进行建议的更改后,它会给出与以前相同的错误。
    • 我非常怀疑这一点,因为最初产生错误的行 (float(line)) 在更改后的脚本中不存在。如果您报告错误,请始终包含引发错误的行。
    • Traceback(最近一次调用最后):文件“C:\Users\JINAY\AppData\Local\Programs\Python\Python35\testfile.py”,第 10 行,在 中用于行reader: ValueError: could not convert string to float: '102.919,103.36' this this error which is returned
    • 是的,但是在这种情况下第 10 行是什么?我不知道你的行数。
    • 几乎不可能,如果您的数据真的像您说的那样。您确定数字之间没有逗号而不是空格吗?
    猜你喜欢
    • 2020-04-02
    • 2011-11-25
    • 2021-09-15
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多