2017-12-26 14 views
-1

Ich habe Daten aus einer SQL-Datenbanktabelle extrahiert, hatte aber anhaltende Probleme mit dem Versuch, ein Diagramm zwischen zwei Variablen zu zeichnen. Dies ist auf Konvertierungsprobleme zwischen Datentypen zurückzuführen. Ich habe zuerst erfolgreich einen list zu einem str Datentyp konvertiert und jetzt möchte ich es entweder in einen float/int/decimal Typ umwandeln, damit ich es mit matplotlib verwenden kann. Ich fühle mich im Moment fest, da ich die str Daten zu keinem von ihnen konvertieren kann. Hier findet mein Skript ist:Schwierigkeit beim Konvertieren von Str-Daten in int/float/decimal für das Zeichnen mit Matplolib

import mysql.connector as mariadb 
import matplotlib as mpl 
mpl.use('Agg') 
import numpy as np 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 
from matplotlib import pyplot 
from decimal import Decimal 
import pandas as pd 

mariadb_connection = mariadb.connect(user='user', password='password', database='mydatabase') 
cur = mariadb_connection.cursor() 
cur.execute("SELECT time, current FROM table1") 

current = [] 
time = [] 

for row in cur.fetchall(): 
    current.append(int(row[1])) 
    time.append(str(row[0])) 

print(type(time)) #at this point terminal shows it is a list data type 
time = pd.to_datetime(time) 
print(type(time)) #at this point terminal shows it is a <class 'pandas.core.indexes.datetimes.DatetimeIndex'>data type 

print(type(current)) #at this point, terminal shows it is a list data type 
current=','.join(str(v) for v in current) 
print(type(current)) #at this point, terminal shows it is a str data 
current=float(current) #at this point, I get an error stating ValueError: invalid literal for float() 
print(type(current)) 

mariadb_connection.close() 

plt.figure() 
plt.plot(time, current) 

plt.show() 
fig.savefig('plot.jpg') 

Auf dieses Skript ausgeführt wird, erhalte ich eine Fehlermeldung, ValueError: invalid literal for float(): 51,52,52,53,52,52,53,53,55,54,58,72,63,68,79,140,133,102,116,120,189,196,151,249,277,218,206,210,212,173,194,216,181,166,221,212,175,189,288,300,281,210,266

ich dann die Leitung current=float(current)-current=int(current) geändert, um zu versuchen, die str Daten zu int Typ konvertieren und es heißt eine weiteren Fehler ValueError: invalid literal for int() with base 10: '51,52,52,53,.....

ich versuchte dann auch meine aktuellen Variablen dezimal Typ zu konvertieren, indem diese Zeile zu current=decimal(current) ändern, aber ich decimal.InvalidOperation: Invalid literal for Decimal: '51,52,52....

Irgendwelche Ratschläge, wie ich meine current Werte zu int/float/decimal Typ konvertieren kann?

Aktualisierungen: Die Umwandlungsschritte für die aktuelle Variable müssen nicht durchlaufen werden. Anscheinend reicht es aus, die Integer-Liste mit Pandas-Plotting zu verwenden, um eine Darstellung zu erhalten.

+1

Teilen Sie Ihre Zeichenfolge mit ',' Zeichen verwenden, und jede Zahl in einen int umwandeln. Jetzt versuchst du der Maschine zu sagen "Hey, ich habe eine Zeichenfolge und ich möchte, dass sie eine ganze Zahl ist. Kannst du mir sagen, welche Ganzzahl '51, 52,52,53,52 (...) 'ist? ? ". Nein. Sie müssen Ihren Satz in alle abgelösten Zahlen aufteilen. Und dann werden Sie der Maschine sagen: "Hey, ich habe eine Liste von Zahlen, aber sie sind in Form einer Zeichenfolge. Können Sie sie in tatsächliche Zahlen konvertieren?". – IMCoins

+1

Sie hatten 'current' als eine Liste von ganzen Zahlen in der 'for'-Schleife, dann konvertieren Sie es in eine Zeichenfolge und dann wollen Sie eine Liste von floats ... Keine Notwendigkeit dafür. Verwenden Sie Ihre ursprüngliche Liste von Ganzzahlen – joaquin

+0

@joaquin. Ich denke, Sie beziehen sich auf diese Linie? 'current.append (int (row [1])'. Obwohl ich 'int()' angewendet habe, ist der Datentyp, den ich daraus erhalte, immer noch eine Liste. Daher kann ich das immer noch nicht zum Zeichnen meines Graphen verwenden. – Craver2000

Antwort

1

Wenn Sie Pandas verwenden möchten, wird diese Arbeit:

import pandas as pd 

# this is the data you gave (only five values) 
time = ['2017-12-27 12:53:00', '2017-12-27 13:19:00', '2017-12-27 13:20:00', '2017-12-27 13:25:00', '2017-12-27 13:30:00'] 
current = [51, 52, 52, 53, 52] 

df = pd.DataFrame(current, index=time) 
df.plot() 

enter image description here

Verwandte Themen