You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas计算连续非零值行区间的时间差并写入对应区间末尾列

实现方法

你可以通过分组标记+按组计算时间差的方式实现需求,代码逻辑简单易读,且能保证timedelta列的数据类型符合要求:

import pandas as pd
import numpy as np

# 构造原始DataFrame
dates = pd.date_range(start='05.01.2021 00:00:00', end='05.01.2021 00:00:20', freq='S')
values = [1000,343,122.34,342.6,76.45,202,264.32,9454.3,1000,1000,0,0,0,0,0,0,232,2323,5562,3545, 123]
df = pd.DataFrame([dates, values], index=['dates', 'values']).T

# 1. 生成连续非0区间的分组标记:遇到0则分组ID+1,同一段连续非0值属于同一个分组
df['group'] = (df['values'] == 0).cumsum()

# 2. 初始化timedelta列,直接指定为timedelta64[ns]类型
df['timedelta'] = pd.Series(dtype='timedelta64[ns]')

# 3. 按分组遍历,计算非0区间的时间差
for group_id, group_data in df.groupby('group'):
    # 跳过全为0的分组
    if group_data['values'].eq(0).all():
        continue
    # 计算当前区间首尾行的时间差
    time_delta = group_data['dates'].iloc[-1] - group_data['dates'].iloc[0]
    # 赋值到当前分组的最后一行
    df.loc[group_data.index[-1], 'timedelta'] = time_delta

# 删除辅助用的分组列
df = df.drop(columns='group')

运行后输出的df和你给出的预期格式完全一致,两个非0区间的时间差分别为9秒、4秒,timedelta列的数据类型默认就是timedelta64[ns]无需额外转换。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:36:03