我有两个熊猫数据框,每个数据框有两列:测量值和时间戳。我需要将测量值的一阶差相乘,但前提是两个测量间隔之间存在时间重叠。随着数据框的大小变大,我怎样才能有效地做到这一点?例子:
dfA
mesA timeA
0 125 2015-01-14 04:44:49
1 100 2015-01-14 05:16:23
2 115 2015-01-14 08:57:10
dfB
mesB timeB
0 140 2015-01-14 00:13:17
1 145 2015-01-14 08:52:01
2 120 2015-01-14 11:31:44
在这里,我会相乘,(100-125)*(145-140)
因为间隔[04:44:49, 05:16:23]
和之间存在时间重叠[00:13:17, 08:52:01]
,但没有(100-125)
和(120-145)
,因为没有时间重叠。同样,我也会有,(115-100)*(145-140)
但也有(115-100)*(120-145)
,因为两者都有时间重叠。
最后,我必须将所有相关产品汇总为一个值,因此结果不必是数据框。在这种情况下:
s = (100-125)*(145-140)+(115-100)*(145-140)+(115-100)*(120-145) = -425
我目前的解决方案:
s = 0
for i in range(1, len(dfA)):
startA = dfA['timeA'][i-1]
endA = dfA['timeA'][i]
for j in range(1, len(dfB)):
startB = dfB['timeB'][j-1]
endB = dfB['timeB'][j]
if (endB>startA) & (startB<endA):
s+=(dfA['mesA'][i]-dfA['mesA'][i-1])*(dfB['mesB'][j]-dfB['mesB'][j-1])
尽管它似乎有效,但效率非常低,并且对于非常大的数据集变得不切实际。我相信它可以更有效地矢量化,也许使用numexpr
,但我仍然没有找到方法。
编辑:其他数据
mesA timeA
0 125 2015-01-14 05:54:03
1 100 2015-01-14 11:39:53
2 115 2015-01-14 23:58:13
mesB timeB
0 110 2015-01-14 10:58:32
1 120 2015-01-14 13:30:00
2 135 2015-01-14 22:29:26
s = 125