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

按元组首位置ID分组计算Timestamp的最大最小时间差

解决思路与代码实现

这事儿好办!我给你两种实现方案,都能按要求完成分组并计算时间差:

方案一:用Python标准库itertools.groupby

这种方法不需要额外安装第三方库,适合轻量场景:

from itertools import groupby
from pandas import Timestamp

# 补全后的输入示例
abc = [
    (2038, 'A', Timestamp('2010-01-24 00:00:00')),
    (2038, 'A', Timestamp('2010-01-27 00:00:00')),
    (2038, 'A', Timestamp('2010-02-20 00:00:00')),
    (2038, 'B', Timestamp('2017-01-24 00:00:00')),
    (2038, 'B', Timestamp('2017-02-20 00:00:00'))
]

# 1. 先按ID和类别排序,确保groupby能正确分组(groupby依赖有序序列)
sorted_abc = sorted(abc, key=lambda x: (x[0], x[1]))

result = []
# 2. 按(ID, 类别)分组
for (id_val, category), group in groupby(sorted_abc, key=lambda x: (x[0], x[1])):
    # 3. 提取当前组的所有Timestamp
    timestamps = [item[2] for item in group]
    # 4. 计算最新与最早时间的差值
    time_diff = max(timestamps) - min(timestamps)
    # 5. 按要求格式构造结果元组
    result.append((id_val, category, [time_diff]))

print(result)

运行后输出:

[(2038, 'A', [Timedelta('27 days 00:00:00')]), (2038, 'B', [Timedelta('27 days 00:00:00')])]

方案二:用Pandas(适合大数据量场景)

如果你的数据量较大,用Pandas会更高效简洁:

import pandas as pd
from pandas import Timestamp

abc = [
    (2038, 'A', Timestamp('2010-01-24 00:00:00')),
    (2038, 'A', Timestamp('2010-01-27 00:00:00')),
    (2038, 'A', Timestamp('2010-02-20 00:00:00')),
    (2038, 'B', Timestamp('2017-01-24 00:00:00')),
    (2038, 'B', Timestamp('2017-02-20 00:00:00'))
]

# 1. 把元组列表转换成DataFrame
df = pd.DataFrame(abc, columns=['ID', 'Category', 'Timestamp'])

# 2. 分组计算时间差:按ID和类别分组,对Timestamp列取max减min
grouped_df = df.groupby(['ID', 'Category'])['Timestamp'].agg(lambda x: max(x) - min(x)).reset_index()

# 3. 转换成要求的元组列表格式
result = [(row['ID'], row['Category'], [row['Timestamp']]) for _, row in grouped_df.iterrows()]

print(result)

这个方案输出和上面完全一致,而且处理大量数据时性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:20:30