按元组首位置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
相关产品推荐
相关产品推荐

