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
相关产品推荐
相关产品推荐

