我想从MySQL数据库创建温度和时间数据图。我要在matplotlib
上将pandas
和python3
与raspbian
一起使用,我试图在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")
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
答案 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()可以使绘图更加方便,但您可以将其保留为原始格式。