首页 > 解决方案 > 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'

标签: python-3.xdatetimematplotlib

解决方案


您的时间数据不是 matplotlib 熟悉的类型,因此它试图自行转换它,但它不能。而是让它成为一种它可以自己处理的类型。

例如,一个常见的选择是

for tim in time:
        time_container.append(tim.total_seconds())
        time_data = np.array(time_container)

现在您正在使用 datetime.timedelta 对象中的总秒数(即查询的结果)。这是一个浮点数,因此 matplotlib 可以绘制它。如果您不想要总秒数,您可以查看文档以获取其他选项。

https://docs.python.org/3/library/datetime.html


推荐阅读