、、のconcat
2 つを使用できます。DataFrames
interpolate
reindex
DataFrame
特定の数の があると仮定します。DataFrames
ここで、Date
はDateTimeIndex
それらすべての中にあります。質問で 2 つを使用したため、この例では 2 つを使用しますが、コードは任意の数に対して機能します。
df_a
:
Volume Value
Date
2014-01-04 06:00:02 6062 108000
2014-01-04 06:06:05 6062 107200
2014-01-04 06:12:07 6062 97400
2014-01-04 06:18:10 6062 99200
2014-01-04 06:24:12 6062 91300
2014-01-04 06:30:14 6062 84100
2014-01-04 06:36:17 6062 57000
df_b
:
Volume Value
Date
2014-01-04 05:52:50 6062 4.7
2014-01-04 05:58:53 6062 4.7
2014-01-04 06:04:56 6062 4.9
2014-01-04 06:10:58 6062 5.1
2014-01-04 06:17:01 6062 5.2
2014-01-04 06:23:03 6062 5.2
2014-01-04 06:29:05 6062 5.5
2014-01-04 06:35:08 6062 5.5
そして、これらをdict
例として入れます。それらを に直接読み込むdict
ので、この手順を実行する必要はありません。私の例dict
がどのようにフォーマットされているかを示したいだけです。dict
keys
重要ではありません。有効なものはすべて機能しますdict
key
。
dataList = {'a': df_a,
'b': df_b}
これで、あなたが現在いる場所にdataList
たどり着きます。うまくいけば、私のフォーマットはあなたのものと同じです。
最初に行う必要があるのは、を結合することDataFrames
です。dict
keys
を列名として使用してMultiIndex
いるため、特定の列のどのインスタンスがどのDataFrame
. 次のようにできます。
df = pd.concat(dataList.values(), axis=1, keys=dataList.keys())
これにより、次のDataFrame
ようになります。
a b
Volume Value Volume Value
Date
2014-01-04 05:52:50 NaN NaN 6062 4.7
2014-01-04 05:58:53 NaN NaN 6062 4.7
2014-01-04 06:00:02 6062 108000 NaN NaN
2014-01-04 06:04:56 NaN NaN 6062 4.9
2014-01-04 06:06:05 6062 107200 NaN NaN
2014-01-04 06:10:58 NaN NaN 6062 5.1
2014-01-04 06:12:07 6062 97400 NaN NaN
2014-01-04 06:17:01 NaN NaN 6062 5.2
2014-01-04 06:18:10 6062 99200 NaN NaN
2014-01-04 06:23:03 NaN NaN 6062 5.2
2014-01-04 06:24:12 6062 91300 NaN NaN
2014-01-04 06:29:05 NaN NaN 6062 5.5
2014-01-04 06:30:14 6062 84100 NaN NaN
2014-01-04 06:35:08 NaN NaN 6062 5.5
2014-01-04 06:36:17 6062 57000 NaN NaN
次に、欠損値を埋めるために補間する必要があります。補間し'time'
mode
て、時間インデックスを適切に処理できるようにします。
df = df.interpolate('time')
これにより、次のDataFrame
ようになります。
a b
Volume Value Volume Value
Date
2014-01-04 05:52:50 NaN NaN 6062 4.700000
2014-01-04 05:58:53 NaN NaN 6062 4.700000
2014-01-04 06:00:02 6062 108000.000000 6062 4.738017
2014-01-04 06:04:56 6062 107352.066116 6062 4.900000
2014-01-04 06:06:05 6062 107200.000000 6062 4.938122
2014-01-04 06:10:58 6062 99267.955801 6062 5.100000
2014-01-04 06:12:07 6062 97400.000000 6062 5.119008
2014-01-04 06:17:01 6062 98857.851240 6062 5.200000
2014-01-04 06:18:10 6062 99200.000000 6062 5.200000
2014-01-04 06:23:03 6062 92805.801105 6062 5.200000
2014-01-04 06:24:12 6062 91300.000000 6062 5.257182
2014-01-04 06:29:05 6062 85472.375691 6062 5.500000
2014-01-04 06:30:14 6062 84100.000000 6062 5.500000
2014-01-04 06:35:08 6062 62151.239669 6062 5.500000
2014-01-04 06:36:17 6062 57000.000000 6062 5.500000
すべてのファイルのすべてのデータを保持するため、一般的にはここで終了するのが最善だと思いcsv
ます。しかし、あなたは、最長の時間ポイントのみが必要だと言いましたcsv
。それを取得するには、最長のものを見つけて、DataFrame
そのインデックスに対応する行を取得する必要があります。最長のものを見つけるのDataFrame
は簡単です。最大の長さのものを見つけるだけです。その時点のみを保持することindex
も簡単です。それを使用してスライスするだけですindex
(loc
このようにスライスする方法を使用します)。
longind = max(dataList.values(), key=len).index
df = df.loc[longind]
これにより、次の final が得られますDataFrame
。
a b
Volume Value Volume Value
Date
2014-01-04 05:52:50 NaN NaN 6062 4.7
2014-01-04 05:58:53 NaN NaN 6062 4.7
2014-01-04 06:04:56 6062 107352.066116 6062 4.9
2014-01-04 06:10:58 6062 99267.955801 6062 5.1
2014-01-04 06:17:01 6062 98857.851240 6062 5.2
2014-01-04 06:23:03 6062 92805.801105 6062 5.2
2014-01-04 06:29:05 6062 85472.375691 6062 5.5
2014-01-04 06:35:08 6062 62151.239669 6062 5.5
必要に応じて、これを 1 行にまとめることができます。
df = pd.concat(dataList.values(), axis=1, keys=dataList.keys()).interpolate('time').loc[max(dataList.values(), key=len).index]
または、おそらく少し明確な 4 行:
names = dataList.keys()
dfs = dataList.values()
longind = max(dfs, key=len).index
df = pd.concat(dfs, axis=1, keys=names).interpolate('time').loc[longind]
私の最終結果があなたが示したものと異なる理由がわかりません。私はあなたの例をMATLAB
(R2015A)で自分で実行し、ここで得たものと同じ結果を得たので、例とは異なるデータセットで最終データを生成したと思われます.