如何在Pandas中筛选指定时间范围重复项:找出1小时内通话≥3次的手机号
解决方案
针对你要找出1小时内拨打3次及以上电话的手机号需求,以下是适合新手的分步实现方案:
1. 转换时间列格式
首先必须将"Date Time"列转为pandas可识别的datetime类型,否则无法进行时间范围计算:
import pandas as pd # 加载你的数据(如果是Excel就用pd.read_excel,根据实际数据源调整) df = pd.read_csv("your_data_file.csv") # 自动识别时间格式并转换,infer_datetime_format参数能提升大文件的处理速度 df["Date Time"] = pd.to_datetime(df["Date Time"], infer_datetime_format=True)
2. 按手机号分组并排序
按手机号分组后,确保每个手机号的通话记录是按时间顺序排列的,这是后续时间窗口计算的基础:
# 先按手机号、时间排序,再分组(group_keys=False避免额外的分组索引) df_sorted = df.sort_values(["Phone No", "Date Time"]).groupby("Phone No", group_keys=False).apply(lambda x: x)
3. 统计1小时内的通话次数
使用pandas的滚动时间窗口功能,统计每个通话时间点往前1小时内的总通话次数,筛选出次数≥3的记录:
# 对每个手机号的时间列,用1小时窗口统计窗口内的记录数 df_sorted["1h_call_count"] = df_sorted.groupby("Phone No")["Date Time"].rolling(window="1h", closed="left").count().reset_index(level=0, drop=True) # 筛选出所有1小时内通话≥3次的记录 filtered_records = df_sorted[df_sorted["1h_call_count"] >= 3] # 提取所有符合条件的唯一手机号 target_phones = filtered_records["Phone No"].unique()
关键参数说明
window="1h":设置滚动窗口的时间跨度为1小时closed="left":表示窗口包含左边界(即当前时间点不算入窗口,只统计之前1小时内的记录;如果需要包含当前时间,改为closed="both"即可)- 该方法针对大数量级数据(30万条)优化过,效率优于逐条对比的方式
内容的提问来源于stack exchange,提问作者Stephen Yip
相关产品推荐
相关产品推荐

