【问题标题】:how can i plot a graph with timedelta using matplotlib如何使用 matplotlib 绘制带有 timedelta 的图形
【发布时间】:2014-08-22 11:01:09
【问题描述】:

我正在尝试使用 dattime X timedelta 绘制图表

http://pastebin.com/QsnXdU0j

def graph_entre_mamadas(tempo_entre_mamadas):
    import matplotlib.pyplot as plt
    import matplotlib
    eixo_x = [i[0] for i in tempo_entre_mamadas]
    eixo_y = [i[1] for i in tempo_entre_mamadas]
    #print eixo_x
    #print eixo_y

    plt.plot(eixo_x, eixo_y, 'ro')
    plt.gcf().autofmt_xdate()
    plt.show()

我的变量 eixo_x 是 datetime.datetime 的列表,而 eixo_y 变量是 datetime.timedelta 的列表。

当我执行这个方法时,我得到这个错误:

  graph_entre_mamadas(tempo_entre_mamadas_v)
  File "consome_mama.py", line 111, in graph_entre_mamadas
    plt.plot(eixo_x, eixo_y, 'ro')
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2832, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 3997, in plot
    self.add_line(line)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 1507, in add_line
    self._update_line_limits(line)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 1516, in _update_line_limits
    path = line.get_path()
  File "/usr/lib/pymodules/python2.7/matplotlib/lines.py", line 677, in get_path
    self.recache()
  File "/usr/lib/pymodules/python2.7/matplotlib/lines.py", line 410, in recache
    y = np.asarray(yconv, np.float_)
  File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 320, in asarray
    return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number



eixo_x : [datetime.datetime(2014, 6, 27, 9, 21, 28), datetime.datetime(2014, 6, 27, 10, 50, 28), datetime.datetime(2014, 6, 27, 13, 26, 28), datetime.datetime(2014, 6, 27, 15, 36, 28), datetime.datetime(2014, 6, 27, 16, 36, 28), datetime.datetime(2014, 6, 27, 17, 23, 28), datetime.datetime(2014, 6, 27, 20, 40, 28), datetime.datetime(2014, 6, 27, 21, 20, 28), datetime.datetime(2014, 6, 27, 22, 11, 28), datetime.datetime(2014, 6, 28, 2, 42, 28)]
eixo_y : [datetime.timedelta(0, 9000), datetime.timedelta(0, 4440), datetime.timedelta(0, 8100), datetime.timedelta(0, 7140), datetime.timedelta(0, 1800), datetime.timedelta(0, 1920), datetime.timedelta(0, 10920), datetime.timedelta(0, 1320), datetime.timedelta(0, 1920), datetime.timedelta(0, 13740)]

我该怎么做?

【问题讨论】:

  • 你没有调用你的函数。此外,在函数内部导入是不常见的。
  • 在我的脚本中我调用了这个函数,我得到了这个错误:
  • eixo_x 和 eixo_y 长什么样子?它们最终会成为浮动列表吗?
  • eixo_x 是 datetime.datetime 的列表,eixo_y 变量是 datetime.timedelta 的列表
  • 将时间增量转换为秒。我认为这不受支持。

标签: python datetime matplotlib timedelta


【解决方案1】:

Matplotlib 没有提供简单的时间增量转换方法

但是,您可以使用 matplotlib.dates.date2num 轻松转换 matplotlib 浮点表示中的日期。

因此,一个可行的解决方案是使用开始时间加上增量创建一个日期,然后使用date2num 进行转换,最后在转换时对这两个日期进行区分。

这是一个例子:

import matplotlib
import datetime

x0 = datetime.datetime(2014, 6, 27, 9, 21, 28)
duration = datetime.timedelta(hours=1)
converted_starting_time = matplotlib.dates.date2num(x0)
converted_finish_time = matplotlib.dates.date2num(x0 + duration)
converted_delta = converted_finish_time - converted_starting_time

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2023-02-01
    • 2016-08-17
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多