2017-12-22 16 views
1

私はnumpyとpandasにかなり新しいと言って始めましょう。私はパンダのデータフレームを構築しようとしていますが、私は自分が適切なやり方で何かをやっているとは確信していません。オブジェクトのリストからパンダのデータフレームを構築する

私の設定では、.Netオブジェクトの大量のリスト(私はほとんど制御できません)があり、これからpandasデータフレームを使用して時系列を構築したいと考えています。デモ用に単純なプレースホルダクラスに.Netクラスを置き換えた例があります。コードのlistOfthingsは、基本的には.Netから取得したもので、これをpandasデータフレームに変換したいと考えています。

私の質問は以下のとおりです。

  1. 私が最初にnumpyの配列を構築することにより、データフレームを構築します。これは必要ですか?また、この配列のサイズは1000x2ではありません。ここでnumpyを使用するより良い方法はありますか?
  2. 文字列をdatetime64にキャストできないように見えるため、このコードは機能しません。文字列がISO形式であるため、これは私を混乱させ、このように解析しようとすると動作します:np.datetime64(str(np.datetime64('now','us')))

コードサンプル:事前に

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']) 

おかげ

答えて

1

Q1:

私は最初np.arrayを行い、その後、データフレームを作成する必要はないと思います。これは、例えば、完全に正常に動作します:

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

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

は後に追加されました:

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

Q2:

を私はpd.to_datetime( 'いくつかの日付が')ほとんど常に右のそれを得ることに気づきました。フォーマットを指定しなくても。これはおそらく役立ちます。

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

@PandasRocksにお返事ありがとうございます。しかし私は私の場合にあなたの答えをどのように適用できるかは分かりません。私の例では 'ListOfThings'を与えられていますが、インデックスとしてdatetimesを持つデータフレームを構築する方法をdemostrateできますか? – DoubleTrouble

+1

@DoubleTrouble - 別の行を追加しました。私はあなたがジェネレータ構文を使うことができると思うので、Pandasはインデックスと値をその場で作成します。私が誤解されていないならば、Pandasシリーズは数が少ない配列とは区別されます。 – PandasRocks

+0

それはとても素敵です、私を助けてくれてありがとう – DoubleTrouble

関連する問題