python-3.x - TypeError:float() 参数必须是字符串或数字,而不是 'datetime.timedelta'
问题描述
我想用从数据库中获取的数据、电压(浮点数)和时间(时间)绘制一个图,现在我得到了错误是堆栈。请帮忙,或者有没有最好的方法可以解决这个问题。?
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:\Users\Kennedy Mulenga\Desktop\Level 5\18136709_BIT_280_Arduino_ECG_Project\fetch_all.py", line 31, in <module>
fetch_voltage()
File "C:\Users\Kennedy Mulenga\Desktop\Level 5\18136709_BIT_280_Arduino_ECG_Project\fetch_all.py", line 28, in fetch_voltage
plt.plot(time_data, voltage_data)
File "C:\Users\Kennedy Mulenga\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\pyplot.py", line 3019, in plot
return gca().plot(
File "C:\Users\Kennedy Mulenga\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\axes\_axes.py", line 1607, in plot
self.add_line(line)
File "C:\Users\Kennedy Mulenga\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\axes\_base.py", line 2101, in add_line
self._update_line_limits(line)
File "C:\Users\Kennedy Mulenga\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\axes\_base.py", line 2123, in _update_line_limits
path = line.get_path()
File "C:\Users\Kennedy Mulenga\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\lines.py", line 1022, in get_path
self.recache()
File "C:\Users\Kennedy Mulenga\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\lines.py", line 663, in recache
x = _to_unmasked_float_array(xconv).ravel()
File "C:\Users\Kennedy Mulenga\AppData\Local\Programs\Python\Python39\lib\site-packages\matplotlib\cbook\__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'
解决方案
您的时间数据不是 matplotlib 熟悉的类型,因此它试图自行转换它,但它不能。而是让它成为一种它可以自己处理的类型。
例如,一个常见的选择是
for tim in time:
time_container.append(tim.total_seconds())
time_data = np.array(time_container)
现在您正在使用 datetime.timedelta 对象中的总秒数(即查询的结果)。这是一个浮点数,因此 matplotlib 可以绘制它。如果您不想要总秒数,您可以查看文档以获取其他选项。
推荐阅读
- java - 即使查询在控制台中工作,JPQL 查询也会返回 NullPointerException
- python - ANN 实现过拟合
- java - JavaFX 折线图无法正确清除
- php - 没有从课堂上获得价值
- ruby-on-rails - 如何重构ruby rest-client get方法
- python - Python 请求 HTTP 响应 406
- docker - 运行两个 Docker 容器(一个反向代理 nginx,另一个是 dotnetcore 应用程序)
- mysql - 使用 1 个 MySQL 表进行访问,要求提供凭据
- java - 如何在json数组中获取内部数组的键值
- python - 迭代数据框时如何引用行和列