3

こんにちは、このコードでデータフレームの辞書を作成しました

import os
import pandas 
import glob

path="G:\my_dir\*"
dataList={}

for files in glob.glob(path):
    dataList[files]=(read_csv(files,sep=";",index_col='Date'))

辞書に存在するさまざまなデータフレームには、さまざまな時間サンプルがあります。dataFrame(A) の例は次のとおりです。

Date               Volume   Value 
2014-01-04 06:00:02 6062   108000.0
2014-01-04 06:06:05 6062   107200.0
2014-01-04 06:12:07 6062   97400.0
2014-01-04 06:18:10 6062   99200.0
2014-01-04 06:24:12 6062   91300.0
2014-01-04 06:30:14 6062   84100.0
2014-01-04 06:36:17 6062   57000.0

dataFrame(B)の例は

Date                Volume Value 
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

別のデータ フレームの行数が同じではありません。次のように、異なるデータ フレームを 1 つのデータ フレームにマージしたいと考えています。

    Data                 Volume       B               A               Value(DataframeN)
2014/04/01 05:52:50      6062        4.70            NaN
2014/04/01 05:58:53      6062        4.70            NaN
2014/04/01 06:04:56      6062        4.90            107465.51
2014/04/01 06:10:58      6062        5.10            100652.60
2014/04/01 06:17:01      6062        5.20            98899.57
2014/04/01 06:23:03      6062        5.20            92618.56
2014/04/01 06:29:05      6062        5.50            85301.73
2014/04/01 06:35:08      6062        5.50            61523.06

コマンドを使用してMatlabでこれを簡単に実行しました

ts_A=timeseries(ValueA,datenum(DateA));
ts_B=timeseries(ValueB,datenum(DateB));
res_A=resample(ts_A,datenum(DateB));

いくつかのcsvファイルのセットに対してこれを行う必要があるため、pythonでプロセスを自動化したい.

TNX

4

1 に答える 1

5

、、のconcat2 つを使用できます。DataFramesinterpolatereindexDataFrame

特定の数の があると仮定します。DataFramesここで、DateDateTimeIndexそれらすべての中にあります。質問で 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)で自分で実行し、ここで得たものと同じ結果を得たので、例とは異なるデータセットで最終データを生成したと思われます.

于 2015-06-16T10:16:01.800 に答える