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

如何按Status分组计算状态内datetime差值及时间累计和(cumsum of time)?

解决方案:按状态分组计算相邻时间差与累计时间和

针对你提供的数据集,我们可以用Python的pandas库快速实现需求。下面是完整的实现步骤和代码:

核心步骤

  • 先把时间列转换成可计算的datetime类型,这是时间差计算的基础
  • 按Status字段分组,计算每组内相邻时间的差值
  • 将时间差转换为分钟数并格式化显示
  • 同时计算每组内的时间累计和(满足需求里的额外要求)

完整代码实现

import pandas as pd

# 原始数据集
raw_data = {
    'x': ['14/09/2017 15:30:31', '14/09/2017 15:30:34', '14/09/2017 16:40:25',
          '14/09/2017 17:00:25', '15/09/2017 09:00:20', '15/09/2017 10:00:20'],
    'Status': ['A', 'A', 'B', 'B', 'A', 'A']
}

# 转换为DataFrame
df = pd.DataFrame(raw_data)

# 把字符串时间转为datetime类型
df['x'] = pd.to_datetime(df['x'], format='%d/%m/%Y %H:%M:%S')

# 按Status分组,计算相邻时间差(转成分钟)
df['diff.time'] = df.groupby('Status')['x'].diff().dt.total_seconds() / 60

# 格式化时间差列:空值留空,数值显示为"X mins"格式
df['diff.time'] = df['diff.time'].apply(lambda x: f'{int(x)} mins' if pd.notnull(x) else '')

# 计算每组内的时间累计和(转成分钟并格式化)
df['cumsum_time'] = df.groupby('Status')['diff.time'].apply(
    lambda col: col.str.extract('(\d+)').astype(float).cumsum().fillna(0).astype(int).astype(str) + ' mins'
)

# 整理成你期望的输出格式(如果不需要累计和列,去掉即可)
result_df = df[['x', 'Status', 'diff.time']].copy()
# 把时间转回原始字符串格式
result_df['x'] = result_df['x'].dt.strftime('%d/%m/%Y %H:%M:%S')

# 输出结果
print(result_df.to_markdown(index=False))

最终输出结果

xStatusdiff.time
14/09/2017 15:30:31A
14/09/2017 15:30:34A3 mins
14/09/2017 16:40:25B
14/09/2017 17:00:25B20 mins
15/09/2017 09:00:20A
15/09/2017 10:00:20A60 mins

如果需要展示累计和列,只需要调整result_df的列选择,把cumsum_time加进去即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:09:11