如何对pandas布尔时间序列按小时聚合连续无间隔的1事件
实现方案
核心思路
连续1构成的独立事件,只会在数值从0跳变到1的时刻产生新计数。我们先标记所有跳变到1的起始点,再按小时对起始点的数量求和,即可得到每小时的独立事件数,不会重复统计连续的1。
完整代码
接在你现有生成df的代码之后运行即可:
# 标记每个独立事件的起始点:值为1代表此处是新事件开始 event_start = df.diff() == 1 # 处理每列第一行的边界:如果首行值为1,也算作一个事件起始 event_start = event_start.fillna(df.iloc[0] == 1).astype(int) # 按小时聚合统计各条件的事件数 hourly_event_count = event_start.resample('H').sum()
边界情况说明
如果你的场景需要将跨小时的连续事件,在涉及的每个小时都计数1次(比如事件从00:59持续到01:02,那么0点和1点各统计1次),可以用自定义聚合函数实现:
def count_hour_events(group): # 统计当前小时内的跳变事件数 event_cnt = (group.diff() == 1).sum() # 判断当前小时首行是否是前一小时延续下来的事件 if group.iloc[0] == 1: last_hour_last_ts = group.index[0] - pd.Timedelta(minutes=1) if last_hour_last_ts in df.index and df.loc[last_hour_last_ts, group.name] == 1: event_cnt += 1 return event_cnt hourly_event_count = df.resample('H').apply(count_hour_events)
以你给出的示例数据验证,输出的0点统计结果为:condition1_bool=1、condition2_bool=0、condition3_bool=1,符合预期规则。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

