根据另一个(不规则)时间序列对熊猫进行下采样时间序列

时间:2019-03-15 09:27:49

标签: python pandas

我用下面的例子来说明我的问题。 我有两个熊猫数据框。

第一个具有十个第二时间步长,这是连续的。两天的示例数据:

import pandas as pd
import random
t_10s = pd.date_range(start='1/1/2018', end='1/3/2018', freq='10s')
t_10s = pd.DataFrame(columns = ['b'],
                     data = [random.randint(0,10) for _ in range(len(t_10s))],
                     index = t_10s)

下一个数据帧有五分钟的时间步长,但是白天只有数据,并且每天的日志记录在每天的不同时间开始。两天的示例数据,从早晨的两个不同时间开始,类似于真实数据:

t_5m1 = pd.date_range(start='1/1/2018 08:08:30', end='1/1/2018 18:03:30', freq='5min')
t_5m2 = pd.date_range(start='1/2/2018 08:10:25', end='1/2/2018 18:00:25', freq='5min')
t_5m = t_5m1.append(t_5m2)

t_5m = pd.DataFrame(columns = ['a'],
                    data = [0 for _ in range(len(t_5m))],
                    index = t_5m)

现在我要对t_5m中的每个数据点x进行操作,以在围绕x的五分钟窗口中找到t_10s数据的等效平均值。

现在,我已经找到一种使用列表理解的方法,如下所示:

tstep = pd.to_timedelta(2.5, 'm')
t_5m['avg'] = [t_10s.loc[((t_10s.index >= t_5m.index[i] - tstep) &
                          (t_10s.index < t_5m.index[i] + tstep))].b.mean() for i in range(0,len(t_5m))]

但是,我想在至少两年的时间序列中并且在许多列中执行此操作(不仅仅是此处的b。当前解决方案是对相关列进行for循环)。然后,代码变得非常慢。谁能想到一个可以更有效地做到这一点的技巧?我已经考虑过使用resample或groupby。如果我有固定的5分钟间隔,那会起作用,但是由于几天之间的间隔是不规律的,所以我无法使其正常工作。感谢任何输入!

环顾四周,例如here,但找不到我需要的东西。

0 个答案:

没有答案