如何在Python Pandas中切换数据流

时间:2013-10-03 11:06:27

标签: python datetime pandas time-series

我有两个数据流,都是一系列(时间戳,值)元组。 即:

[(2013-04-03T22:16:36+0000, 2334.5), (2013-04-03T22:46:36+0000, 43543.23), ...]  

这个想法是其中一个将是“首选”而另一个不是,我想创建一个单个时间序列,它是可用时较高优先级流的结果,并且当没有时,它会回退到最不优选的流。

我的想法是将来自两个流的值的时间戳放入桶中,并使用桶作为D​​ataFrame的索引,每个流都有一列,以及每个桶中的(时间戳,值)元组列表。然后我可以通过每个桶,并选择具有最高点数的那个。例如。

数据框看起来像这样:

timestamp            stream1                                  stream2  
2013-04-03 00:00:00  [(2013-04-03T00:16:36+0000, 2334.5),     [(2013-04-03T00:17:36+0000, 2314.5)]
                      (2013-04-03T00:17:36+0000, 2314.5)]
2013-04-03 00:30:00  [(2013-04-03T00:43:44+0000, 43543.23),   [(2013-04-03T00:47:36+0000, 2364.5)] 
                      (2013-04-03T00:54:24+0000, 4443.23)]
2013-04-03 01:00:00  []                                       [(2013-04-03T01:01:30+0000, 34.34)]
2013-04-03 01:30:00  [(2013-04-03T01:35:32+0000, 238734.3)]   [(2013-04-03T01:45:32+0000, 238734.3)]

在这种情况下,时间戳已放入半小时的桶中,而stream1是首选流。对于00:00的桶,将选择stream1中的两个点,对于00:30处的桶,将选择流1中的两个点,对于桶,在01:00,将选择stream2中的单个点作为stream1没有数据,对于01:30的存储桶,将选择stream1中的单个数据点,因为它是首选流。

我该怎么做呢?我尝试创建数据框并使用resample('h', how='count')拆分为每小时计数,并使用groupby,但无法将时间戳放入存储桶并为每个存储桶创建每个流的值列表。

1 个答案:

答案 0 :(得分:2)

我有一个解决方案,但我不确定它是多么有效(我自己是一个熊猫菜鸟),或者是否有一种方式更像'熊猫式':

hh = date_range('2013-01-01T00:30:00', periods=48, freq='1800S')
s5 = date_range('2013-01-01', freq='5S', end='2013-01-02')
s5 = s5[:720] + s5[1440:]  # introduce a gap in the 5 second data
hh_d = Series(hh.astype('int') / 10 ** 9, index=hh)
s5_d = Series(s5.astype('int') / 10 ** 9, index=s5)
df = DataFrame({
    'hh': hh_d,
    '5s': s5_d,
})
# Make a grouping, for simplicity by day, hour
grp = df.groupby(lambda x: (x.day, x.hour))

result = TimeSeries()
for name, group in grp:
    winner = None
    for column in group.keys():  # iterate over the columns (streams)
        data = group[column].dropna()  # ditch any NaNs that will be present
        # next, perform the test (in this case, just the length)
        if not winner or len(data) > len(group[winner].dropna()):
            winner = column
    # finally, add the data to the result set.
    result = result.append(group[winner].dropna())

在5秒间隙时检查结果给出:

ipdb> result[719:725]
2013-01-01 00:59:55    1357001995
2013-01-01 01:00:00    1357002000
2013-01-01 01:30:00    1357003800
2013-01-01 02:00:00    1357005600
2013-01-01 02:00:05    1357005605
2013-01-01 02:00:10    1357005610
dtype: float64

这表明在间隙期间选择了半小时的流。

上面的示例基于组中每列的长度,但我想可以应用任何测试。

希望有更多熊猫经验的人可以详细说明我的稻草人答案!