我用下面的例子来说明我的问题。 我有两个熊猫数据框。
第一个具有十个第二时间步长,这是连续的。两天的示例数据:
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,但找不到我需要的东西。