matplotlib时间与日期

时间:2013-01-14 20:01:57

标签: python matplotlib

我正在使用psycopg2从数据库中提取数据以获取日期和记录故障的时间。我想绘制时间在y轴上的位置,日期在x轴上。点图似乎是理想的。

这是我获取数据的代码的一部分,并使用zip来制作我想要绘制的两个对象,

    cur.execute("SELECT date, time FROM querytimes where server = (%s) AND date > CURRENT_DATE - (%s) AND fail = 'Yes'", (server,days,))

    # retrieve the whole result set
    data = cur.fetchall()
    # close connection
    cur.close()
    conn.close()
    # Test
    date, time = zip(*data)

这些是生成的“日期”和时间“对象,

  

(datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime。 date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1, 10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date (2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,10),datetime.date(2013,1,11),datetime.date(2013,1,12) ),datetime.date(2013,1,12),datetime.date(2013,1,13))

     

(datetime.time(15,25,3),datetime.time(15,26,3),datetime.time(15,27,4),datetime.time(15,28,3),datetime。时间(15,29,3),datetime.time(15,30,4),datetime.time(15,31,3),datetime.time(15,32,4),datetime.time(15,33, 3),datetime.time(15,34,3),datetime.time(15,35,3),datetime.time(15,36,3),datetime.time(15,37,3),datetime.time (15,38,3),datetime.time(15,39,3),datetime.time(15,40,3),datetime.time(0,20,4),datetime.time(6,19,3) ),datetime.time(10,50,3),datetime.time(2,19,3))

我在绘制此图时遇到问题。根据我的理解,这些需要在matplotlib之前首先转换为浮点数才能理解数据?

尝试使用date2num,它适用于“date”对象,但不知道如何为“time”对象执行此操作。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用Pandas轻松实现此目标。

import pandas as pd
ts = pd.Series(times, index=dates)
ts.plot(rot=30, style='x-')

获得类似

的内容

times by dates

替代方法:将日期时间作为指数

将datetime对象作为索引,而不仅仅是日期对象有时允许更大的灵活性,所以我个人会用这种方式表示这种数据。您可以通过首先组合日期和时间对象

来实现
datetimes = []
for date, time in zip(dates, times):
    datetimes.append(datetime.datetime.combine(date, time))

构建您的TimeSeries

ts = pd.Series(1, index=datetimes)

(1表示当时一次失败)

现在,您可以在此类数据上创建另一个有用的视图,以便您查看每天的数量。

ts.groupby(lambda x : x.date()).sum().plot(rot=30, style='x-', kind='bar')

quantity per day