2012-09-03 4 views
7

Ich habe eine CSV-Datei mit einer Zeitspalte, die POSIX-Zeitstempel in Millisekunden darstellt. Wenn ich es in Pandas lese, liest es es korrekt als Int64, aber ich möchte es in einen DatetimeIndex konvertieren. Im Moment konvertiere ich es zuerst in Datetime-Objekt und dann in einen DatetimeIndex.Idiomatische Art, POSIX-Zeitstempel in Pandas zu analysieren?

In [20]: df.time.head() 

Out[20]: 
0 1283346000062 
1 1283346000062 
2 1283346000062 
3 1283346000062 
4 1283346000300 
Name: time 

In [21]: map(datetime.fromtimestamp, df.time.head()/1000.) 
Out[21]: 
[datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 62000), 
datetime.datetime(2010, 9, 1, 9, 0, 0, 300000)] 

In [22]: pandas.DatetimeIndex(map(datetime.fromtimestamp, df.time.head()/1000.)) 
Out[22]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2010-09-01 09:00:00.062000, ..., 2010-09-01 09:00:00.300000] 
Length: 5, Freq: None, Timezone: None 

Gibt es einen idiomatischen Weg, dies zu tun? Und, noch wichtiger, ist dies die empfohlene Methode zum Speichern von nicht eindeutigen Zeitstempeln in Pandas?

Antwort

6

Sie können einen Konverter in Verbindung mit read_csv verwenden.

In [423]: d = """\ 
timestamp data 
1283346000062 a 
1283346000062 b 
1283346000062 c 
1283346000062 d 
1283346000300 e 
""" 

In [424]: fromtimestamp = lambda x:datetime.fromtimestamp(int(x)/1000.) 

In [425]: df = pandas.read_csv(StringIO(d), sep='\s+', converters={'timestamp': fromtimestamp}).set_index('timestamp') 

In [426]: df.index 
Out[426]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2010-09-01 15:00:00.062000, ..., 2010-09-01 15:00:00.300000] 
Length: 5, Freq: None, Timezone: None 

In [427]: df 
Out[427]: 
          data 
timestamp 
2010-09-01 15:00:00.062000 a 
2010-09-01 15:00:00.062000 b 
2010-09-01 15:00:00.062000 c 
2010-09-01 15:00:00.062000 d 
2010-09-01 15:00:00.300000 e 
+1

Danke! Das ist einfacher als das, was ich gemacht habe. Denkst du Pandas ist ein gutes Werkzeug für unregelmäßig beabstandete, nicht eindeutig Zeitstempel Zeitreihen? – signalseeker

+1

Pandas ist in der Lage, unregelmäßig beabstandete, nicht eindeutig mit Zeitstempel versehene Zeitreihen zu verarbeiten. Zeitserie ist eine große Sache für Pandas –

5

Intern werden Zeitstempel in Int gespeichert, die Nanosekunden darstellen. Sie verwenden die Nummern datetime/timedelta. Das Problem mit Ihren Zeitstempeln besteht darin, dass sie in ms-Genauigkeit sind, die Sie bereits kennen, da Sie durch 1000 teilen. In diesem Fall ist es einfacher zu astypen ('M8 [ms]'). Es bedeutet im Wesentlichen, diese Ints als datetime-ints mit ms-Genauigkeit anzuzeigen.

In [21]: int_arr 
Out[21]: 
array([1283346000062, 1283346000062, 1283346000062, 1283346000062, 
     1283346000300]) 

In [22]: int_arr.astype('M8[ms]') 
Out[22]: 
array(['2010-09-01T09:00:00.062-0400', '2010-09-01T09:00:00.062-0400', 
     '2010-09-01T09:00:00.062-0400', '2010-09-01T09:00:00.062-0400', 
     '2010-09-01T09:00:00.300-0400'], dtype='datetime64[ms]') 

Pandas nehmen an, dass jedes reguläre int-Array in M8 [ns] ist. Ein Array mit einem datetime64 dtype wird korrekt interpretiert. Sie können die M8 [ns] -Darstellung eines DatetimeIndex anzeigen, indem Sie auf das Attribut asi8 zugreifen.

[EDIT] Ich weiß, dass dir das nicht direkt mit read_csv helfen wird. Ich dachte mir einfach, ich würde schnellstmöglich zwischen Timestamp-Arrays umwandeln.

+0

Danke, das ist gut zu wissen. – signalseeker

+1

Diese Methode ist schneller als die Verwendung eines Konverters. pandas wird ms -> ns transparent unter die Haube werfen –

+0

Danke. Für die Aufzeichnung ist dieser Ansatz ungefähr 40% schneller als die Verwendung eines Konverters. – signalseeker

Verwandte Themen