2016-07-22 9 views
4

Wenn ich pandas read_csv verwende, um eine Spalte mit einem timezone aware datetime zu lesen (und diese Spalte als Index anzugeben), konvertiert pandas es in einen timezone naive utc DatetimeIndex.Wie Zeitzonen bewusste Datumsangaben als Zeitzone naive lokale DatetimeIndex mit read_csv in Pandas lesen?

Daten in Test.csv:

DateTime,Temperature 2016-07-01T11:05:07+02:00,21.125 2016-07-01T11:05:09+02:00,21.138 2016-07-01T11:05:10+02:00,21.156 2016-07-01T11:05:11+02:00,21.179 2016-07-01T11:05:12+02:00,21.198 2016-07-01T11:05:13+02:00,21.206 2016-07-01T11:05:14+02:00,21.225 2016-07-01T11:05:15+02:00,21.233

-Code von csv zu lesen:

In [1]: import pandas as pd 

In [2]: df = pd.read_csv('Test.csv', index_col=0, parse_dates=True) 

Daraus ergibt sich ein Index, der die Zeitzone naive UTC-Zeit darstellt:

In [3]: df.index 

Out[3]: DatetimeIndex(['2016-07-01 09:05:07', '2016-07-01 09:05:09', 
      '2016-07-01 09:05:10', '2016-07-01 09:05:11', 
      '2016-07-01 09:05:12', '2016-07-01 09:05:13', 
      '2016-07-01 09:05:14', '2016-07-01 09:05:15'], 
      dtype='datetime64[ns]', name='DateTime', freq=None) 

Ich habe versucht, eine date_parser Funktion zu verwenden:

In [4]: date_parser = lambda x: pd.to_datetime(x).tz_localize(None) 

In [5]: df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=date_parser) 

Dies ergab das gleiche Ergebnis.

Wie kann ich read_csv eine DatetimeIndex erstellen, die Zeitzone naive ist und stellt die Ortszeit anstelle der UTC-Zeit?

Ich benutze Pandas 0.18.1.

+0

Haben Sie sich diese [http://stackoverflow.com/questions/16628819/convert-pandas-timezone-aware-datetimetindex-to-naive-timestamp-but-in-certain-t?rq=1 angesehen) –

+0

Ja, habe ich. Aber diese spezielle Frage betrifft den Umgang mit Zeitzoneninformationen, die tatsächlich vorhanden sind. In meiner Frage verliert pandas.read_csv die Zeitzoneninformationen, indem es das Datum-Zeit-Lesen von der CSV in eine Zeitzone naive utc Datetime umwandelt. – Puggie

Antwort

2

Die answer von Alex führt zu einer Zeitzone bewusst DatetimeIndex. Um eine Zeitzone naive lokale DatetimeIndex, wie sie in der OP gefragt, informieren dateutil.parser.parser die Zeitzone zu ignorieren, indem ignoretz=True Einstellung:

import dateutil 

date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True) 
df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=date_parser) 

print(df) 

Ausgänge

     Temperature 
DateTime       
2016-07-01 11:05:07  21.125 
2016-07-01 11:05:09  21.138 
2016-07-01 11:05:10  21.156 
2016-07-01 11:05:11  21.179 
2016-07-01 11:05:12  21.198 
2016-07-01 11:05:13  21.206 
2016-07-01 11:05:14  21.225 
2016-07-01 11:05:15  21.233 
2

Gemäß the docs verwendet der Standard date_parserdateutil.parser.parser. Gemäß the docs for that function werden Zeitzonen standardmäßig ignoriert. Wenn Sie also dateutil.parser.parser als date_parser kwarg angeben, werden Zeitzonen nicht konvertiert.

import dateutil 

df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=dateutil.parser.parse) 

print(df) 

Ausgänge

      Temperature 
DateTime        
2016-07-01 11:05:07+02:00  21.125 
2016-07-01 11:05:09+02:00  21.138 
2016-07-01 11:05:10+02:00  21.156 
2016-07-01 11:05:11+02:00  21.179 
2016-07-01 11:05:12+02:00  21.198 
2016-07-01 11:05:13+02:00  21.206 
2016-07-01 11:05:14+02:00  21.225 
2016-07-01 11:05:15+02:00  21.233 
+0

Diese Antwort ist sicherlich hilfreich, führt aber zu einem zeitzonenbewussten DatetimeIndex. Das Hinzufügen des Arguments 'ignetztz = True' in der Parsing-Funktion ergibt die gewünschte Zeitzone naiven DatetimeIndex. Ich habe das als neue Antwort auf die Frage hinzugefügt. – Puggie

0

Ich nahm die dateutil Technik heute früher, aber haben sich seither auf eine schnellere Alternative umgestellt:

date_parser = lambda ts: pd.to_datetime([s[:-5] for s in ts])) 

Edit: s[:-5] korrekt ist (Screenshot hat Fehler)

In der Abbildung unten importieren I ~ 55MB von Tab-getrennten Dateien. Die dateutil Methode funktioniert, nimmt aber Größenordnungen länger.

enter image description here

Das war Pandas 0.18.1 und dateutil 2.5.3 verwenden.

Verwandte Themen