0

我正在使用 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.time(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 并且适用于“日期”对象,但不确定如何为“时间”对象执行此操作。

谢谢

4

1 回答 1

0

您可以使用Pandas轻松实现这一点。

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

得到类似的东西

按日期的时间

替代方法:日期时间作为索引

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

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

建立你的时间序列

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

(1表示当时有一次失败)

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

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

每天数量

于 2013-01-14T20:23:52.327 回答