Pandas DataFrame, matplotlib и различные типы данных SQL - PullRequest
0 голосов
/ 22 января 2019

Я хочу создать график данных о температуре и времени из базы данных MySQL. Используя matplotlib и pandas с python3 на raspbian Я пытаюсь вставить температуру по оси Y и время по оси X.

Ось Y работает нормально, она отображает временные значения (float) без каких-либо проблем. Однако, когда я пытаюсь добавить время (time), он выводит ошибочные данные, которые я предполагаю, потому что у него другой тип данных. Если я использую другой столбец, такой как ID (int), то это работает. Я не уверен, нужно ли мне преобразовывать время в строку или есть другой способ обойти это.

Ответ может лежать в Изменить тип данных столбцов в Pandas , который кажется похожим, но поскольку я вставляю данные из MySQL, я не уверен, как можно применить их к своей проблеме.

Моя конечная цель - создать задание cron, которое будет запускаться каждые пять минут и выводить линейный график на основе изображений с временными значениями за последние 24 часа по оси Y и значениями time вдоль оси X, а затем копировать его в мою папку 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

Первая и последняя строки из фрейма данных

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 голосов
/ 23 января 2019

попробуйте функцию 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 () может показывать график более удобным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...