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

2024-09-28 20:43:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

数据大致如下所示:

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

我想做的是根据脉冲的出现对数据帧进行重新采样或重新编制索引,并对新时间戳之间的hotIn求和

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

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

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

我已经探索了使用两步for-elif循环,只检查hotOut==1,但在大型数据集上速度非常慢。如果可能的话,熊猫的时间戳功能肯定会更出色。 我也不能简单地在设定的频率上重新采样,因为脉冲之间的间隔是周期性变化的。主要问题是脉冲变化之间的时间戳周期,因此一般的重采样规则不起作用。我在提取与脉冲相关的时间戳并将其作为新索引应用于main时,也遇到了匹配数据帧长度的问题


Tags: 数据index记录时间分辨率仪表代表整数
2条回答

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

您不想在索引上分组。只要'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

相关问题 更多 >