你可以concat
两个DataFrames
, interpolate
, 然后reindex
就DataFrame
你想要的。
我假设我们有一定数量的DataFrames
,其中Date
是DateTimeIndex
所有的。我将在此示例中使用两个,因为您在问题中使用了两个,但代码适用于任何数字。
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
例子中。您将它们直接读入 a dict
,因此您不需要执行此步骤。我只想展示我的示例dict
是如何格式化的。dict
keys
没关系,任何有效的dict
key
都可以:
dataList = {'a': df_a,
'b': df_b}
这使我们到达了您当前所在的位置,dataList
希望我的格式与您的格式相同。
您需要做的第一件事是将DataFrames
. 我使用dict
keys
asMultiIndex
列名,这样您就可以跟踪给定列的哪个实例来自哪个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]
或者,也许更清晰的 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]
我不确定为什么我的最终结果与您显示的不同。我自己在(R2015A)中运行了您的示例,MATLAB
并得到了与此处相同的结果,因此我怀疑您使用与示例不同的数据集生成了最终数据。