【问题标题】:Using Matplotlib, visualize CSV data使用 Matplotlib,可视化 CSV 数据
【发布时间】:2015-09-23 08:31:28
【问题描述】:

Using matplotlib/pandas/python, I cannot visualize data as values per 30mins and per days是一个新问题,与这个问题密切相关。

我想用 Matplotlib 可视化 CSV 数据。

下面是我的代码1.30mins.py

import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np

style.use('ggplot')

x,y =np.loadtxt('total_watt.csv',
                unpack = True,
                delimiter = ',')

plt.plot(x,y)

plt.title('Example')
plt.ylabel('Y axis')
plt.xlabel('X axis')

plt.show()

当我实现1.30mins.py 时,我收到以下错误消息。

(DataVizProj)Soma-Suzuki:Soma Suzuki$ python 1.30mins.py
Traceback (most recent call last):
  File "1.30mins.py", line 10, in <module>
    delimiter = ',')
  File "/Users/Suzuki/Envs/DataVizProj/lib/python2.7/site-packages/numpy/lib/npyio.py", line 856, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]
ValueError: invalid literal for float(): 2011-04-18 13:22:00

这是我的total_watt.csv

2011-04-18 21:22:00 659.670303375527
2011-04-18 21:52:00 576.304871428571
2011-04-18 22:22:00 2,497.20620579196
2011-04-18 22:52:00 2,790.20392088608
2011-04-18 23:22:00 1,092.20906629318
2011-04-18 23:52:00 825.994417375886
2011-04-19 00:22:00 2,397.16672089666
2011-04-19 00:52:00 1,411.66659265233

据我自己搜索,我需要在我的程序中添加converters%y-%m-%t​。

我的python版本是2.76 我的 matpltlib 版本是 1.42

【问题讨论】:

  • 您的错误与您尝试读取的文件无关,而是与您的 matplotlib 相关。您使用的是哪个版本的 python 和 matplotlib?其次,我建议您尝试使用datetime dtype 作为您的数据,并从您的最后一列中删除,
  • 我的 matplotlib 版本是; >>> import matplotlib as mpl >>> print mpl.__version__ 1.4.2 我的python版本是; (DataVizProj)Soma-Suzuki:~ Suzuki$ python -V Python 2.7.6
  • 我得到一个不同的错误,即“ValueError:float() 的无效文字:2011-04-18 21:22:00 659.670303375527”。我使用 Python 2.7.6 和 Matplotlib 1.4.3,导入样式没有问题。另外,请注意 plt 未在您的代码中定义。
  • 感谢我定义了“plt”并添加到我的问题中。
  • 我又遇到了一个错误。我编辑了我的问题

标签: python csv matplotlib


【解决方案1】:

我不知道 numpy 是否有直接读取日期时间对象的功能。但是,如果您不是在寻找一个优雅的解决方案,这里有一些快速而肮脏的代码,可以使用另外两个模块 csv 和 datetime 来完成您想要的操作。

我使用文件“sample.csv”(注意我放置逗号的位置):

     2011-04-18 21:22:00, 659.670303375527
     2011-04-18 21:52:00, 576.304871428571

代码是

     from matplotlib import style
     from matplotlib import pylab as plt
     import numpy as np

     style.use('ggplot')

     filename='sample.csv'
     date=[]
     number=[]

     import csv
     with open(filename, 'rb') as csvfile:
         csvreader = csv.reader(csvfile, delimiter=',', quotechar='|')
         for row in csvreader:
             if len(row) ==2 :
                 date.append(row[0])
                 number.append(row[1])

     number=np.array(number)

     import datetime
     for ii in range(len(date)):
         date[ii]=datetime.datetime.strptime(date[ii], '%Y-%m-%d %H:%M:%S')

     plt.plot(date,number)

     plt.title('Example')
     plt.ylabel('Y axis')
     plt.xlabel('X axis')

     plt.show()

给我下图。

如果您正在寻找使用 numpy 的更优雅的解决方案,我相信有人会知道更好的方法。

【讨论】:

  • 非常感谢!!它成功地工作了!!如果您能告诉我什么是“delimiter=',', quotechar='|'”,那就太好了。我试图搜索,但我无法理解它..
  • delimiter 确定分隔单元格的内容,这里是逗号。但是,如果您将其设置为由空格分隔 -> delimiter=' ' 则文件将包含三行,因为每行有三个空格。 "delimiter" 和 "quotechar" 都指示 writer 对象只引用那些包含这些特殊字符的字段。如果答案是您正在寻找的,请接受它,这样其他人就不会再尝试回答了。
  • 实际上,我的 csv 文件很大,而且有很多行。我不认为我可以把"," 放到每一行...
  • 在您发布的示例中,有时有逗号,有时没有。也许使用空格作为分隔符?然后,取第一行,row[0] = "2011-04-18", row[1] = "21:22:00", row[2]="659.670303375527"。您只需要搜索并删除任何逗号。第三行如下所示:row[0] = "2011-04-18", row[1] = " 22:22:00", row[2]=" 2,497.20620579196"。因此,也许您还需要删除逗号前面的数字。我不确定这意味着什么。
  • 在 csv 文件“github.com/camenergydatalab/EnergyDataSimulationChallenge/blob/…中;没有”,…但是当我用数字打开这个csv文件时,添加了“,”。但是当我用 xcode 打开这个文件时,csv 文件就像 2011-04-18 13:22:00,925.840613752523 2011-04-18 13:52:00,483.295891812865 2011-04-18 14:22:00,915.76163366013 之间的时间和价值。我认为这就是你的两个代码都成功实现的原因!
【解决方案2】:

你的数据

2011-04-18 21:22:00 659.670303375527
2011-04-18 21:52:00 576.304871428571
...

不使用空格或逗号分隔。它可以被视为具有固定宽度 然而列。 np.genfromtxt 可以读取固定宽度的数据。而不是通过 字符串到delimiter,传递一个整数序列,表示每个整数的宽度 字段。


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib import style
style.use('ggplot')

x, y = np.genfromtxt('total_watt.csv',
                     unpack=True,
                     delimiter=[19, 10**6], dtype=None)

x = mdates.datestr2num(x)
y = np.array(np.char.replace(y, ',', ''), dtype=float)

fig, ax = plt.subplots()
ax.plot(x, y)

plt.title('Example')
plt.ylabel('Y axis')
plt.xlabel('X axis')
xfmt = mdates.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)

fig.autofmt_xdate()
plt.show()

产量

【讨论】:

  • 非常感谢。但是,我不知道为什么,我可以同时实现你的代码和负概率的代码。结果几乎是一样的。
  • 在 csv 文件 "github.com/camenergydatalab/EnergyDataSimulationChallenge/blob/…" 中没有 ","... 但是当我用 Numbers 打开这个 csv 文件时,会添加 "," ..
  • 但是当我用 xcode 打开这个文件时,csv 文件就像 2011-04-18 13:22:00,925.840613752523 2011-04-18 13:52:00,483.295891812865 2011-04-18 14:22 :00,915.761633660131 时间和值之间有一个逗号。我认为这就是您的两个代码都成功实施的原因!
  • 看起来“原始”actual data 是逗号分隔的。所以你可以使用delimiter=',' 而不是delimiter=[19, ...]
  • 非常感谢!!我会做的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2011-07-04
  • 2018-07-16
  • 2017-09-14
  • 2021-11-04
  • 2020-09-14
  • 2022-01-03
相关资源
最近更新 更多