Pandas如何按来源和日期分组计算新闻发布平均时间间隔
Pandas按来源+日期分组计算相邻新闻平均发布间隔
需求说明
现有简化版新闻发布数据的pandas DataFrame,需要计算每个独立来源、每个自然日发布的相邻两条新闻之间的平均时间间隔。
输入数据
source date time Investing.com 2017-05-11 08:00:00 Investing.com 2017-05-11 12:00:00 Investing.com 2017-05-11 16:00:00 yahoo.com 2017-05-11 09:00:00 yahoo.com 2017-05-11 12:00:00 yahoo.com 2017-05-11 15:00:00 yahoo.com 2017-05-12 06:00:00 yahoo.com 2017-05-12 12:00:00 yahoo.com 2017-05-12 18:00:00
期望输出
source date Average_Daily_time Investing.com 2017-05-11 04:00:00 yahoo.com 2017-05-11 03:00:00 yahoo.com 2017-05-12 06:00:00
已尝试方案
已将date和time字段合并为datetime时间戳字段,编写代码如下:
df.sort_values('datetime').groupby('source')['datetime'].apply(lambda x: x.diff().dt.seconds.mean()/60)
问题说明
上述代码仅按source字段分组,会合并同一来源所有日期的数据计算全量平均时间间隔,跨天的时间差也会被纳入统计,无法按单独日期拆分统计对应平均间隔。
实现代码
核心调整点:将分组维度从单一source改为source + date双维度,确保每个分组对应单个来源单日的所有新闻数据,组内排序后计算相邻时间差的平均值即可。
import pandas as pd # 确保datetime字段为标准时间类型,按分组维度+时间排序 df['datetime'] = pd.to_datetime(df['datetime']) df = df.sort_values(by=['source', 'date', 'datetime']) # 双维度分组计算平均时间间隔 result = ( df.groupby(['source', 'date'], as_index=False)['datetime'] .apply(lambda group: group.diff().mean()) .rename(columns={'datetime': 'Average_Daily_time'}) ) # 可选:将时间差格式化为 时:分:秒 的字符串格式,和示例输出样式对齐 result['Average_Daily_time'] = result['Average_Daily_time'].apply( lambda td: f"{td.components.hours:02d}:{td.components.minutes:02d}:{td.components.seconds:02d}" )
逻辑说明
- 分组键加入
date字段后,不会再出现跨天计算时间差的问题,每个分组的统计范围严格限定为单来源单日 - 直接对
Timedelta类型的时间差取平均值,比手动换算秒数/分钟数的鲁棒性更强,不会出现精度损失 - 上述代码运行后输出结果和示例期望完全匹配
内容的提问来源于stack exchange,提问作者Khaned
相关产品推荐
相关产品推荐

