我有一堆Pandas时间序列数据。这里是一个例子,用于说明(真实数据每个系列中有大约100万条记录):
>>> for s in series:
print s.head()
print
2014-01-01 01:00:00 -0.546404
2014-01-01 01:00:00 -0.791217
2014-01-01 01:00:01 0.117944
2014-01-01 01:00:01 -1.033161
2014-01-01 01:00:02 0.013415
2014-01-01 01:00:02 0.368853
2014-01-01 01:00:02 0.380515
2014-01-01 01:00:02 0.976505
2014-01-01 01:00:02 0.881654
dtype: float64
2014-01-01 01:00:00 -0.111314
2014-01-01 01:00:01 0.792093
2014-01-01 01:00:01 -1.367650
2014-01-01 01:00:02 -0.469194
2014-01-01 01:00:02 0.569606
2014-01-01 01:00:02 -1.777805
dtype: float64
2014-01-01 01:00:00 -0.108123
2014-01-01 01:00:00 -1.518526
2014-01-01 01:00:00 -1.395465
2014-01-01 01:00:01 0.045677
2014-01-01 01:00:01 1.614789
2014-01-01 01:00:01 1.141460
2014-01-01 01:00:02 1.365290
dtype: float64
每个系列中的时间不是唯一的。例如,最后一个系列在“2014-01-01 01:00:00”有3个值。第二个系列在那个时间只有一个值。同时,并不是所有时间都需要在所有系列中出现。
我的目标是创建一个合并的DataFrame,其中包含所有各个时间序列中的时间联合起来的结果。每个时间戳应根据需要重复多次。因此,如果时间戳在上面的系列中出现了(2,0,3,4)次,则在生成的DataFrame中应将该时间戳重复4次(频率的最大值)。每个列的值应该是"向前填充"的。
例如,上述合并的结果应该是:
c0 c1 c2
2014-01-01 01:00:00 -0.546404 -0.111314 -0.108123
2014-01-01 01:00:00 -0.791217 -0.111314 -1.518526
2014-01-01 01:00:00 -0.791217 -0.111314 -1.395465
2014-01-01 01:00:01 0.117944 0.792093 0.045677
2014-01-01 01:00:01 -1.033161 -1.367650 1.614789
2014-01-01 01:00:01 -1.033161 -1.367650 1.141460
2014-01-01 01:00:02 0.013415 -0.469194 1.365290
2014-01-01 01:00:02 0.368853 0.569606 1.365290
2014-01-01 01:00:02 0.380515 -1.777805 1.365290
2014-01-01 01:00:02 0.976505 -1.777805 1.365290
2014-01-01 01:00:02 0.881654 -1.777805 1.365290
为了给您一个关于我的真实数据的大小和“独特性”的概念:
>>> [len(s.index.unique()) for s in series]
[48617, 48635, 48720, 48620]
>>> len(times)
51043
>>> [len(s) for s in series]
[1143409, 1143758, 1233646, 1242864]
以下是我尝试过的方法:
我可以创建所有唯一时间的并集:
uniques = [s.index.unique() for s in series]
times = uniques[0].union_many(uniques[1:])
现在我可以使用times
对每个系列进行索引:
series[0].loc[times]
但是这似乎会重复每个 times
中的值,这不是我想要的。
我不能使用 times
对系列进行 reindex()
,因为每个系列的索引不唯一。
我可以通过缓慢的 Python 循环或在 Cython 中执行它来完成,但是否有一种 "仅限 pandas" 的方法可以做到我想做的事情?
我使用以下代码创建了我的示例系列:
def make_series(n=3, rep=(0,5)):
times = pandas.date_range('2014/01/01 01:00:00', periods=n, freq='S')
reps = [random.randint(*rep) for _ in xrange(n)]
dates = []
values = numpy.random.randn(numpy.sum(reps))
for date, rep in zip(times, reps):
dates.extend([date]*rep)
return pandas.Series(data=values, index=dates)
series = [make_series() for _ in xrange(3)]
TypeError: _cumcount_array() takes exactly 2 arguments (1 given)
。我需要执行.grouper._max_groupsize, dtype='int64')
,然后它似乎可以工作了。现在正在尝试在真实数据上运行。 - Alok--np.arange(len(s0))
之类的东西... - Andy Hayden