Mehrere datetime Spalten zu einer zusammenfügen

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
tine_beginner
User
Beiträge: 21
Registriert: Sonntag 7. Juni 2015, 14:47

Hallo zusammen,

ich habe eine .dat-Datei mit Temperatur-Zeitreihen. Die ersten 6 Spalten ergeben die Datums- und Uhrzeitangaben, sind allerdings auf 6 Spalten aufgeteilt. Ich müsste diese zu einer datetime-Spalte zusammenfügen. Nach intensiverer Recherche bin ich auf pandas gestoßen, habe damit allerdings noch gar nicht gearbeitet und bin auch noch relativer Python-Neuling.
Meine Datei sieht wie folgt aus:

Code: Alles auswählen

YYYY MM DD HH MM SS  Julday(UTC)  Julday(MST)       S01      S02     	S03     
2015 03 23 02 47 30  293.032986  292.741319      12.50      12.76      14.56      
2015 03 23 02 50 00  293.034722  292.743056      12.35      12.64      14.83      
2015 03 23 02 52 30  293.036458  292.744792      12.11      12.40      14.64      
2015 03 23 02 55 00  293.038194  292.746528      12.04      12.18      14.49  
Ich habe es bereits mit folgendem Code versucht:

Code: Alles auswählen

import numpy as np
import pandas as pd
myfile = np.genfromtxt('C:/.../file.dat',dtype=str,skip_header=1)

df = pd.read_csv(myfile, header=None, index_col='datetime', 
                 parse_dates={'datetime': [0,1,2,3,4,5]}, 
                 date_parser=lambda x: pd.datetime.strptime(x, '%Y %m %d %H %M %S'))
Was mir allerdings den Fehler auswirft:

Code: Alles auswählen

IOError: Expected file path name or file-like object, got <type 'numpy.ndarray'> type
einige Abwandlungen habe ich ebenfalls versucht, bspw.

Code: Alles auswählen

import pandas as pd 
df = pd.read_csv('C:/.../file.dat', header=1, sep='\s+\s', parse_dates=([range(6)])
Was den Fehler auswirft:

Code: Alles auswählen

ValueError: [0, 1, 2, 3, 4, 5] is not in list
Vielleicht weiß jemand eine Lösung. Herzlichen Dank im Voraus!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Pandas ist eine tolle Library aber für dieses Problem unnötig kompliziert. Was du dir anschauen solltest ist die csv Library aus der Standard Library. Die beschränkt sich ausschliesslich auf das Parsen von solchen csv Dateien und ist damit wesentlich kleiner und einfacher zu verstehen. Damit solltest du wesentlich weiter kommen, wenn du irgendwo stecken bleibst helfen wir dir dann gerne weiter.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@tine_beginner: an Deiner Stelle würde ich ja die ersten 7 Spalten ignorieren und die 8 Spalte als Tage seit dem 3.6.2014 9Uhr MST nehmen.
tine_beginner
User
Beiträge: 21
Registriert: Sonntag 7. Juni 2015, 14:47

@DasIch: Danke für die super schnelle Antwort.
Ich habe die von dir verlinkte Seite zur csv library jetzt mehrfach durchgescrollt und auch nach csv library irgendwie verbunden mit datetime gegoogelt... Ich hätte jetzt so noch weniger einen Ansatz wie es weitergehen soll als vorher :shock: Ich weiß leider nicht annähernd, welche der csv Funktionen mich der Lösung näher bringt als pandas. :?:
tine_beginner
User
Beiträge: 21
Registriert: Sonntag 7. Juni 2015, 14:47

@Sirius3: die Julday-Angaben sind leider nicht korrekt, da falsch berechnet, deswegen beziehe ich mich auf die in UTC angegebenen ersten 6 Spalten. Leider kann ich diese nicht mehr aus meiner Frage rauslöschen.
Zuletzt geändert von tine_beginner am Mittwoch 25. November 2015, 20:19, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@tine_beginner: dann nimm halt nur die 7. Spalte als Tage seit dem 3.6.2014 2Uhr UTC.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du wirst das Problem schon selbst lösen müssen, du wirst egal wieviel du suchst nicht (immer) die Lösung zu exakt deinem Problem irgendwo finden. Das wäre auch äußerst langweilig. Du kannst aber Teillösungen zu Teilproblemen finden, die du dann zu der Lösung für dein Problem zusammensetzt.

Du musst erstmal die Datei parsen so dass die Daten sinnvoll strukturiert sind. Einzelne Zeilen könnte man als Tupel oder Dictionary repräsentieren. Wenn du so eine Zeile hast, kannst du die Spalten zusammenfassen und bekommst neue Zeilen. Diese neuen Zeilen kannst du dann in eine neue CSV Datei schreiben.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hallo,

mit dem Modul csv kannst du die Datei erstmal einlesen. Als Ergebnis stehen dir dann die Zeilen mit den einzelnen Spalten zur Verfügung. Jetzt musst du nur noch aus den entsprechenden Spalten ein (class) datetime.datetime zusammensetzen.

Alternativ kannst auch die Datei zeilenweise einlesen, aus jeder Zeile die entsprechenden Datenals einen String extrahieren und diesen dann mit datetime.datetime.strptime in ein datetime.datetime.Objekt umwandeln.

mfg

PS: schau mal in der Python-Doku nach den fetten geschriebenen Begriffen :)
Antworten