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

如何按api_spec_id计算提交时间间隔并添加至DataFrame列?

问题描述

我有如下结构的DataFrame:

commitdates api_spec_id/
0      2021-04-07  84
1      2021-05-31  84
2      2021-06-21  84
3      2021-06-18  84
4      2020-12-06  124

        commits          commitDate                         
0           32       2021-04-07 12:52:56            
1           32       2021-05-31 03:12:37              
2           32       2021-06-21 06:50:33              
3           32       2021-06-18 05:11:23              
4           37       2020-12-06 20:35:45            

需要按api_spec_id(对应不同API)分组,计算每个API首次提交与末次提交的时间间隔,期望输出如下:

api_spec_id  Age (in days)
0        84          89
1        84          89
2        84          89
3        84          67
4        124         56
已尝试的方法

方法一

gb = final_api.groupby('api_spec_id')['commitDate']
(gb.max() - gb.min()) / pd.Timedelta(days=1)

得到结果:

api_spec_id
84         74.748345
124        22.486979
164       124.080359
184       921.732488
214        11.994167
             ...    
224530      1.987951
224606      8.221690
224613     67.541366
224627    151.838333
224665    657.721481

方法二

s = final_api.groupby(['api_spec_id','commitdates'])['timestamp'].agg(['min','max']); s['max']-s['min']

返回结果为0天。

不确定计算结果是否正确,也不知道如何将结果添加至DataFrame的新列中,寻求帮助。

解决方案

1. 结果正确性验证

方法一的逻辑是准确的:按api_spec_id分组后取commitDate的最大、最小值之差,转换为天数。你得到的小数结果是因为计算了完整时间戳(含时分秒)的间隔,和期望的整数天数差异,大概率是因为你期望按commitdates(仅日期部分)计算跨度。

如果要按自然日计算,先提取日期部分:

final_api['commit_date_only'] = final_api['commitDate'].dt.date

再分组计算:

gb_date = final_api.groupby('api_spec_id')['commit_date_only']
age_days = (gb_date.max() - gb_date.min()).days

这样得到的就是忽略时分秒的自然日间隔。

2. 将结果映射到原DataFrame

用transform方法可以直接把分组计算的结果填充到原DataFrame的每一行,无需手动合并:

# 按完整时间戳计算并添加列
final_api['Age (in days)'] = final_api.groupby('api_spec_id')['commitDate'].transform(
    lambda x: (x.max() - x.min()) / pd.Timedelta(days=1)
)

# 按日期部分计算并添加列
final_api['Age (in days)'] = final_api.groupby('api_spec_id')['commit_date_only'].transform(
    lambda x: (x.max() - x.min()).days
)

3. 方法二的问题说明

方法二同时按api_spec_id和commitdates分组,同一日期内的timestamp最大最小值差必然为0,这和你需要的整个API时间跨度的需求不匹配,所以结果不符合预期。

内容的提问来源于stack exchange,提问作者Brie MerryWeather

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:55:46