Zeiten und Daten aus txt-Datei importieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Temporal
User
Beiträge: 7
Registriert: Samstag 1. September 2018, 21:23

Hallo zusammen, ich habe das Problem das ich eine txt-Datei mit Daten (dd.mm.jjjj) und Zeiten (hh:mm:ss) habe. Diese würde ich gerne z.B. in ein array übernehmen damit ich damit später rechnen und sie in einen Graphen eintragen kann. Damit das ganze einfacher wird habe ich vor die Zeiten in Sekunden um zu rechnen. Dafür habe ich auch schon etwas funktionierendes hinbekommen. Mein Ziel ist es die Zeiten im array mit einer while-Schleife Schritt für Schritt durchzuarbeiten und in ein neues array die Sekunden einzutragen.
Wahrscheinlich ist es sinnvoll hier mit Datetime zu arbeiten, damit kenne ich mich nur leider gar nicht aus. Es wäre super wenn mir jemand erklären könnte wie ich die Zeiten und Daten in ein array bekomme ohne den Fehler: could not convert string to float: b'18:36:56'

Dankeschön,
Anna
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

Was verstehst Du denn an der Dokumentation zum datetime-Modul denn nicht?
Temporal
User
Beiträge: 7
Registriert: Samstag 1. September 2018, 21:23

Soweit verstehe ich die Dokumentation eigentlich. Nur leider wird dort keine Möglichkeit aufgelistet wie man die Daten aus der txt raus bekommt. Ich arbeite normaler weise nur mit Python um Graphen zu erstellen und verlasse mich dabei auf genfromtxt und arbeite mit den daraus entstehenden arrays. So würde ich es hier gerne auch machen. Damit ich die Werte nacheinander abarbeiten kann. Die Umwandlung in Sekunden und alles später mit datetime ist mir klar.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Kommst Du damit weiter? Du brauchst die datetime.strptime-Funktion und dann den String und einen Format-String (der passt) nutzen.

https://www.tutorialspoint.com/python/time_strptime.htm

Du kannst dann z. B. ein datetime.date- oder datetime.datetime-Objekt draus machen, also z. B. d1 = datetime.date(2018,9,1) usw.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

genfromtext ist hier wahrscheinlich das Problem. Man KANN das dazu bringen, die einzelnen Spalten spezifisch zu konvertieren. Aber das ist ein bisschen mühselig. Benuzt doch einfach Pandas. Da gibt es schon fertige bequeme Funktionen für sowas.

Siehe zb hier viewtopic.php?t=43509&start=15

und natürlich die Antwort von BJ danach beachten.
Temporal
User
Beiträge: 7
Registriert: Samstag 1. September 2018, 21:23

Ich hab mich jetzt an euren beiden Ideen versucht und das geschrieben:

data = pd.read_csv('Batterie.txt', sep="\t ")
print(data)
data.columns = ["a", "b"]
struct_time = time.strptime(a, "%H:%M:%S")
print(a)

Er hat allerdings schon Probleme beim benennen der spalten da er die txt so einließt:
02:32:39\t03:02:39
er scheint das \t beim trennen nicht zu nehmen.

Füge ich noch andere Sache ein wie parse_dates meckert er immer: Falling back to the 'python' engine
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Temporal: Wenn Du '\t ', also Tabulator *gefolgt* von einem Leerzeichen als Trenner angibst, dann wird in der Tat nicht an einem Tabulator *ohne* folgendes Leerzeichen getrennt. Schau mal in die Dokumentation wie ein `sep`-Argument interpretiert wird das länger als ein Zeichen ist. Das erklärt dann auch die Warnung das die Python-Engine verwendet wird. Die wird man los wenn man sie über das passende Argument bewusst auswählt. Sofern Du wirklich mehr als ein Zeichen bei `sep` angeben möchtest.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Temporal
User
Beiträge: 7
Registriert: Samstag 1. September 2018, 21:23

Was ein dämlicher Fehler. Das Leerzeichen ist mir echt nicht aufgefallen, danke
Temporal
User
Beiträge: 7
Registriert: Samstag 1. September 2018, 21:23

Mit den Zeiten kann ich jetzt so arbeiten wie ich es mir Vorgestellt habe. Nur die Daten machen mir noch Probleme. Ich möchte das Format der Daten gerne ändern. Das habe ich bisher getan:

Code: Alles auswählen

data = pd.read_csv('Batterie.txt', sep="\t", header=None)
data.columns = ['a','b','c','d','e']

datetimeobject = pd.to_datetime(data['a'])
date = datetime.strptime(datetimeobject, '%Y-%m-%d')
newformat = date.strftime('%m%d%Y')
Der Fehler ist immer: strptime() argument 1 must be str, not Series
auch wenn ich es so mache:

Code: Alles auswählen

data['a']= data['a'].astype(str)
date = datetime.strptime(data['a'], '%Y-%m-%d')
newformat = date.strftime('%m%d%Y')/code]
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Temporal: Was und vor allem warum willst Du da machen? In der Spalte im Dataframe sollten Zeitstempel stehen, damit man damit arbeiten kann. Die müssen in der Regel auch als Zeitstempel an den Plot übergeben werden. Wie sie dort *angezeigt* werden, regelt man beim Plot.

Ich würde die Daten auch direkt beim einlesen in Zeitstempel umwandeln.

Zudem ist die Fehlermeldung ja auch ziemlich deutlich: `datetime.strptime()` möchte einen Zeichenkette mit einem Datum. Du versuchst da aber ein `Series`-Objekt mit ganz vielen Werten zu übergeben. Das kann offensichtlich nicht funktionieren.

Was ist eigentlich der Grund warum Du die vorhandene Kopfzeile so nichtsagend umbenennst in 'a', 'b', …?

Edit: Und würde es eventuell Sinn machen die Zeitstempel als Index zu verwenden statt als normale Spalte?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten