如何根据列数据对时间序列重新采样/重新索引/分组?

时间:2019-10-07 17:45:55

标签: python pandas

所以我有一个熊猫数据框,其中包含1秒分辨率下的2个用水量值。值为“ hotIn”和“ hotOut”。 hotIn可以以一秒的分辨率记录到加仑的十分之一,而hotOut则记录代表一加仑的整数脉冲,即当发生脉冲时,一加仑已通过仪表。脉冲大约每14-15秒出现一次。

数据大致如下:

library(optrees)

nodes = c(1:8)

from = c(1,1,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7)
to = c(2,3,4,5,4,6,7,3,5,7,2,6,8,5,7,8,6,8)
capacity = c(20,15,10,15,13,15,10,13,10,12,15,7,10,7,8,8,8,10)
arcs = cbind(from, to, capacity)

k = c(1:10)
flows = c()
for (i in seq_along(k))
  tempArcs = cbind(arcs[,-3], arcs[,3]*k[i])
  max = maxFlowFordFulkerson(nodes, tempArcs)
  flows = append(flows, max$max.flow)

sensitivity = cbind(k, flows)
sensitivity

       k flows
 [1,]  1   280
 [2,]  2   280
 [3,]  3   280
 [4,]  4   280
 [5,]  5   280
 [6,]  6   280
 [7,]  7   280
 [8,]  8   280
 [9,]  9   280
[10,] 10   280

我要执行的操作是根据脉冲的出现对数据帧进行重新采样或重新索引,并对新时间戳之间的hotIn求和。

例如,在00:00:00-00:00:05和00:00:06-00:00:13之间对hotIn求和。

理想情况下,结果应如下所示:

Index                       hotIn(gpm)      hotOut(pulse=1gal) 
2019-03-23T00:00:00         4               0 
2019-03-23T00:00:01         5               0 
2019-03-23T00:00:02         4               0 
2019-03-23T00:00:03         4               0 
2019-03-23T00:00:04         3               0 
2019-03-23T00:00:05         4               1 
2019-03-23T00:00:06         4               0 
2019-03-23T00:00:07         5               0 
2019-03-23T00:00:08         3               0 
2019-03-23T00:00:09         3               0 
2019-03-23T00:00:10         4               0 
2019-03-23T00:00:11         4               0 
2019-03-23T00:00:12         5               0 
2019-03-23T00:00:13         5               1

我探索了使用两步式的for-elif循环,该循环仅检查hotOut == 1是否有效,但是在大型数据集上速度很慢。我很肯定Pandas的时间戳功能会更好。 我也不能简单地在设定的频率上重新采样,因为脉冲之间的间隔会定期变化。主要问题是脉冲变化之间的时间戳记周期,因此一般的重采样规则将不起作用。在提取与脉冲相关联的时间戳并将其作为新索引应用于主索引时,我也遇到了与数据帧长度匹配的问题。

2 个答案:

答案 0 :(得分:1)

IIUC,您可以这样做:

s = df['hotOut(pulse=1gal)'].shift().ne(0).cumsum()
(df.groupby(s)
   .agg({'Index':'last', 'hotIn(gpm)':'sum'})
   .reset_index(drop=True)
)

输出:

                 Index  hotIn(gpm)
0  2019-03-23T00:00:05          24
1  2019-03-23T00:00:13          33

答案 1 :(得分:0)

您不想对索引进行分组。您想在'hotOut(pulse=1gal)'发生更改时进行分组。

s = df['hotOut(pulse=1gal)'].cumsum().shift().bfill()

(df.reset_index()
   .groupby(s, as_index=False)
   .agg({'Index': 'last', 'hotIn(gpm)': 'sum', 'hotOut(pulse=1gal)': 'last'})
   .set_index('Index'))

                     hotIn(gpm)  hotOut(pulse=1gal)
Index                                              
2019-03-23T00:00:05          24                   1
2019-03-23T00:00:13          33                   1