2017-12-22 5 views
1

Lassen Sie mich damit beginnen zu sagen, dass ich ziemlich neu zu numpy und Pandas bin. Ich versuche, einen Pandas-Datenrahmen zu konstruieren, aber ich bin mir nicht sicher, ob ich die Dinge in angemessener Weise mache.Konstruieren Pandas Datenrahmen aus einer Liste von Objekten

Meine Einstellung ist, dass ich eine große Liste von .Net-Objekten habe (die ich sehr wenig Kontrolle habe), und ich möchte eine Zeitreihe davon mit Pandas Dataframe bauen. Ich habe ein Beispiel, wo ich die .Net-Klasse mit einer vereinfachten Platzhalterklasse nur zur Demonstration ersetzt. Die listOfthings im Code ist im Grunde, was ich von .Net und ich möchte das in einen Pandas-Datenrahmen konvertieren.

Meine Fragen sind:

  1. ich den Datenrahmen konstruieren, indem zunächst ein numpy Array aufzubauen. Ist das notwendig? Außerdem hat dieses Array nicht die Größe 1000x2, wie ich es erwarte. Gibt es hier eine bessere Möglichkeit, numpy zu verwenden?
  2. Dieser Code funktioniert nicht, da ich nicht in der Lage zu sein scheint, die Zeichenfolge zu einem Datetime64 zu übertragen. Das verwirrt mich, da die Zeichenfolge im ISO-Format ist und es funktioniert, wenn ich versuche, es wie folgt zu analysieren: np.datetime64(str(np.datetime64('now','us'))).

Codebeispiel:

import numpy as np 
import pandas as pd 

class PlaceholderClass: 
    def time(self): 
     return str(np.datetime64('now', 'us')) 
    def value(self): 
     return 100*np.random.random_sample() 


listOfThings = [PlaceholderClass() for i in range(1000)] 

arr = np.array([(x.time(), x.value()) for x in listOfThings], dtype=[('time', np.datetime64), ('value', np.float)]) 

dataframe = pd.DataFrame(data=arr['value'], index=arr['time']) 

Vielen Dank im Voraus

Antwort

1

Q1:

Ich denke, es ist nicht notwendig, zuerst ein np.array zu machen und dann den Datenrahmen erstellen. Das funktioniert völlig in Ordnung, zum Beispiel:

rd = lambda: datetime.date(randint(2005,2025), randint(1,12),randint(1,28)) 

df = pd.DataFrame([(rd(), rd()) for x in range(100)]) 

später hinzugefügt:

df = pd.DataFrame((x.value() for x in listOfThings), index=(pd.to_datetime(x.time()) for x in listOfThings)) 

Q2:

Ich bemerkte, dass pd.to_datetime ('some date') fast immer wird es richtig . Auch ohne Angabe des Formats. Vielleicht hilft das.

In [115]: pd.to_datetime('2008-09-22T13:57:31.2311892-04:00') 
Out[115]: Timestamp('2008-09-22 17:57:31.231189200') 
+0

Danke für Ihre Antwort @PandasRocks. Aber ich verstehe nicht, wie ich deine Antwort in meinem Fall anwenden kann. Können Sie anhand von "ListOfThings" in meinem Beispiel zeigen, wie Sie den Datenrahmen mit den Datumsangaben als Index konstruieren? – DoubleTrouble

+1

@DoubleTrouble - Ich habe eine andere Zeile hinzugefügt. Ich denke, dass Sie die Generator-Syntax verwenden können, so dass Pandas den Index und die Werte im laufenden Betrieb erstellen. Wenn ich mich nicht irre, unterscheiden sich Pandas-Serien von den numply-Arrays. – PandasRocks

+0

Das ist sehr nett, danke, dass du mir geholfen hast – DoubleTrouble

Verwandte Themen