#python-3.x #datetime #matplotlib
Вопрос:
Я хочу создать график с данными, которые я извлекаю из базы данных, voltage (float) и time (time), я получал сообщение об ошибке now am stack. пожалуйста, помогите или есть лучший способ, которым я могу это сделать.?
import matplotlib.pyplot as plt
import numpy as np
import serial as ser
import time
import datetime
import mysql.connector
my_connect = mysql.connector.connect(host="localhost", user="Kennedy", passwd="Kennerdol05071994", database="ecg_db", auth_plugin="mysql_native_password")
mycursor = my_connect.cursor()
voltage_container = []
time_container = []
def fetch_voltage():
pat_id = 1
query = "SELECT voltage, time FROM ecg_data_tbl where patient_id = 1 "
mycursor.execute(query)
result = mycursor .fetchall()
voltage, time = list(zip(*result))
for volts in voltage:
voltage_container.append(volts)
voltage_data = np.array(voltage_container)
for tim in time:
time_container.append(tim)
time_data = np.array(time_container)
plt.plot(time_data, voltage_data)
fetch_voltage()
Мне сказали преобразовать их в массивы, что я и сделал, но ничего не меняется. Получаемая ошибка:
Traceback (most recent call last):
File "C:UsersKennedy MulengaDesktopLevel 518136709_BIT_280_Arduino_ECG_Projectfetch_all.py", line 31, in <module>
fetch_voltage()
File "C:UsersKennedy MulengaDesktopLevel 518136709_BIT_280_Arduino_ECG_Projectfetch_all.py", line 28, in fetch_voltage
plt.plot(time_data, voltage_data)
File "C:UsersKennedy MulengaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibpyplot.py", line 3019, in plot
return gca().plot(
File "C:UsersKennedy MulengaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_axes.py", line 1607, in plot
self.add_line(line)
File "C:UsersKennedy MulengaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_base.py", line 2101, in add_line
self._update_line_limits(line)
File "C:UsersKennedy MulengaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_base.py", line 2123, in _update_line_limits
path = line.get_path()
File "C:UsersKennedy MulengaAppDataLocalProgramsPythonPython39libsite-packagesmatplotliblines.py", line 1022, in get_path
self.recache()
File "C:UsersKennedy MulengaAppDataLocalProgramsPythonPython39libsite-packagesmatplotliblines.py", line 663, in recache
x = _to_unmasked_float_array(xconv).ravel()
File "C:UsersKennedy MulengaAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibcbook__init__.py", line 1333, in _to_unmasked_float_array
return np.asarray(x, float)
TypeError: float() argument must be a string or a number, not 'datetime.timedelta'
Ответ №1:
Ваши данные о времени не относятся к типу, с которым знаком matplotlib, поэтому он пытается преобразовать его сам и не может. Вместо этого сделайте его типом, с которым он может справиться самостоятельно.
Обычным выбором, например, было бы
for tim in time:
time_container.append(tim.total_seconds())
time_data = np.array(time_container)
Теперь вы используете общее количество секунд в вашем объекте datetime.timedelta (это результат вашего запроса). Это значение с плавающей точкой, поэтому matplotlib может его отобразить. Если вам не нужно общее количество секунд, вы можете посмотреть документы для других вариантов.