2017-02-12 2 views
1

Ich habe eine CSV-Datei, die, vereinfacht, sieht wie folgt aus:pandas.read_csv: Wie analysiere ich zwei Spalten als Datumswerte in einer hierarchisch indizierten CSV?

X,,Y,,Z, 
Date,Time,A,B,A,B 
2017-01-21,01:57:49.390,0,1,2,3 
2017-01-21,01:57:50.400,4,5,7,9 
2017-01-21,01:57:51.410,3,2,4,1 

Die ersten beiden Spalten Datum und Uhrzeit sind. Wenn ich das tue“

pandas.read_csv('foo.csv', header=[0,1]) 

ich folgenden Datenrahmen erhalten:

  X Unnamed: 1_level_0 Y Unnamed: 3_level_0 Z Unnamed: 5_level_0 
     Date    Time A     B A     B 
0 2017-01-21  01:57:49.390 0     1 2     3 
1 2017-01-21  01:57:50.400 4     5 7     9 
2 2017-01-21  01:57:51.410 3     2 4     1 

die lästigen unbenannte Einträge in den Spalten Ignoriert jetzt, würde Ich mag die ersten beiden Spalten in einen einzigen Datetime kombinieren. Also habe ich versucht, das parse_dates Argument:

pandas.read_csv('foo.csv', header=[0,1], parse_dates={'datetime': [0,1]}) 

Aber alles, was ich von diesem erhalten, ist eine Zurückverfolgungs:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 646, in parser_f 
    return _read(filepath_or_buffer, kwds) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 401, in _read 
    data = parser.read() 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 939, in read 
    ret = self._engine.read(nrows) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1585, in read 
    names, data = self._do_date_conversions(names, data) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1364, in _do_date_conversions 
    self.index_names, names, keep_date_col=self.keep_date_col) 
    File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 2737, in _process_date_conversion 
    data_dict.pop(c) 
KeyError: "('X', 'Date')" 

Ich bin mir nicht sicher, warum es eine KeyError auf ('X', 'Date') trifft, da diese definitiv in den Spalten vorhanden sind. Ich weiß nicht wirklich, ob das ein Fehler in pandas ist, den ich melden sollte (ich benutze 0.19.2), oder wenn ich gerade etwas nicht verstehe. Irgendwelche Ideen?

+0

yup, scheint wie ein Fehler. Ich habe mit den verschiedenen Optionen herumgespielt, und die, die am besten in Ihrer Situation funktioniert, ist, die Spalten 0 und 1 als Index anzugeben und den Index als Datum zu analysieren, d. 'pd.read_csv ('foo.csv', Kopfzeile = [0,1], Parsedate = True, Index_cols [0,1])'. Dieses Problem zu melden wäre eine gute Idee. –

+0

Ich habe eine PR für dieses Problem eingereicht. Siehe meine Antwort. –

+1

Update: PR wurde für die Veröffentlichung "0.20.0" freigegeben –

Antwort

1

Sie arbeiten rund um kann bei Bedarf:

import datetime as dt 
import pandas as pd 

# read in the csv file 
df = pd.read_csv('foo.csv', header=[0, 1]) 

# get a label for the funky column names 
date_label, time_label = tuple(df.columns.values)[0:2] 

# merge the columns into a single datetime 
dates = [ 
    dt.datetime.strptime('T'.join(ts) + '000', '%Y-%m-%dT%H:%M:%S.%f') 
    for ts in zip(df[date_label], df[time_label])] 

# save the new column 
df['DateTime'] = pd.Series(dates).values 

Update:

ich eine bug und pull request für dieses Problem eingereicht haben. In response zu dem Fehler, jreback (Pandas Lead Maintainer) gab eine ziemlich detaillierte Antwort auf Probleme mit dem Multi-Level-Header aus dem Beispiel. Ich denke, Sie sind sich dieser Probleme bereits bewusst, aber Sie sollten vielleicht lesen, was er geschrieben hat. Am Ende der Antwort hatte er dieses Bit, das eine Arbeit bieten könnte:

Eine einzelne Ebene machen ist einfach nicht sinnvoll in einem Multi-Level-Frame. Ich würde das wahrscheinlich tun:

In [25]: pandas.read_csv(StringIO(data), header=0, skiprows=1, parse_dates={'datetime':[0,1]}) 
Out[25]: 
       datetime A B A.1 B.1 
0 2017-01-21 01:57:49.390 0 1 2 3 
1 2017-01-21 01:57:50.400 4 5 7 9 
2 2017-01-21 01:57:51.410 3 2 4 1 
Verwandte Themen