您好我已使用此代码
创建了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
答案 0 :(得分:5)
您可以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
:
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)中运行了您的示例并获得了与此处相同的结果,因此我怀疑您使用与示例不同的数据集生成了最终数据。