如何按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
相关产品推荐
相关产品推荐

