熊猫DataFrame,matplotlib和不同的SQL数据类型

时间:2019-01-22 04:44:44

标签: python pandas matplotlib

我想从MySQL数据库创建温度和时间数据图。我要在matplotlib上将pandaspython3raspbian一起使用,我试图在Y轴上插入温度,在X轴上插入时间。

Y轴工作正常,可以绘制温度(float),没有任何问题。但是,当我尝试增加时间(time)时,它会输出我认为是错误的数据,因为它具有不同的数据类型。如果我使用另一列,例如ID(int),则它可以工作。我不确定是否需要将时间转换为字符串,或者是否还有其他解决方法。

答案可能出在Change data type of columns in Pandas上,这似乎很相似,但是由于我是从MySQL插入数据,因此不确定如何将其应用于自己的问题。

我的最终目标是使cron作业每五分钟运行一次,并在Y轴上输出基于图像的折线图,其中包含最近24小时的温度,然后在X轴上显示time值,然后将其复制到我的WWW文件夹以通过HTML显示。我知道脚本在输出图像后会丢失任何内容,但这很容易,而且我之前已经做过。我只是无法显示图表来显示X轴时间值。

任何帮助将不胜感激。

import matplotlib.pyplot as plt
import pandas as pd
import MySQLdb

def mysql_select_all():
    conn = MySQLdb.connect(host='localhost',
                           user='user',
                           passwd='password',
                           db='database')
    cursor = conn.cursor()
    sql = "SELECT id,time,date,temperature FROM table ORDER BY id DESC LIMIT 288"
    cursor.execute(sql)
    result = cursor.fetchall()
    df = pd.DataFrame(list(result),columns=["id","time","date","temperature"])
    x = df.time
    y = df.temperature
    plt.title("Temperature Data from Previous 24 Hours", fontsize="20")
    plt.plot(x, y)
    plt.xlabel("Time")
    plt.ylabel("Temperature (\u2103)")
    plt.tick_params(axis='both',which='major',labelsize=14)
    plt.savefig('test.png')
    cursor.close()

print("Start")

mysql_select_all()

print("End")

上面的代码当前输出下面的图像。 current code output

MySQL table

Sample data from table

DataFrame的第一行和最后一行

id                         688
time           0 days 09:55:01
date                2019-01-24
temperature              27.75
Name: 0, dtype: object
id                         401
time           0 days 10:00:01
date                2019-01-23
temperature               24.4
Name: 287, dtype: object

1 个答案:

答案 0 :(得分:0)

尝试pandas.to_datetime()函数。可以将字符串或整数转换为日期时间格式。

原始代码

    df = pd.DataFrame(list(result),columns=["time","temperature"])
    x = df.time
    y = df.temperature

新代码

    df = pd.DataFrame(list(result),columns=["time","temperature"])

    df["time"]=df["time"].astype(np.datetime64)
    #or below code.
    #df["time"]=pd.to_datetime(df["time"])
    #assuming that df.time could be converted to datetime format.
    x = df.time
    y = df.temperature

对于其他代码,尽管df.plot()可以使绘图更加方便,但您可以将其保留为原始格式。