如何按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))
最终输出结果
| x | Status | diff.time |
|---|---|---|
| 14/09/2017 15:30:31 | A | |
| 14/09/2017 15:30:34 | A | 3 mins |
| 14/09/2017 16:40:25 | B | |
| 14/09/2017 17:00:25 | B | 20 mins |
| 15/09/2017 09:00:20 | A | |
| 15/09/2017 10:00:20 | A | 60 mins |
如果需要展示累计和列,只需要调整result_df的列选择,把cumsum_time加进去即可。
内容的提问来源于stack exchange,提问作者Maria Provelegiou
相关产品推荐
相关产品推荐

