使用python

时间:2015-06-15 13:53:05

标签: python csv pandas resampling merging-data

您好我已使用此代码

创建了dataFrame字典
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

不同的数据框没有相同的行数。我想将不同的数据框合并为一个,如下所示:

    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

1 个答案:

答案 0 :(得分:5)

您可以concat DataFramesinterpolate,然后reindex DataFrame上的DataFrames

我假设我们有一定数量的DateDateTimeIndex在所有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] 中的时间点也很简单,只需使用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 方法进行切片)。

df = pd.concat(dataList.values(), axis=1, keys=dataList.keys()).interpolate('time').loc[max(dataList.values(), key=len).index]

这为您提供了以下最终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

如果您愿意,可以将其合并为一行:

map()

或者,也许是稍微清晰的4行:

if (optional.isEmpty()) return Optional.empty();
else return Optional.of(f(optional.get()));

我不确定为什么我的最终结果与你所展示的不同。我自己在T -> Optional<U>(R2015A)中运行了您的示例并获得了与此处相同的结果,因此我怀疑您使用与示例不同的数据集生成了最终数据。