如何按秒级时间间隔统计192.168.1.128的出现次数
按秒统计指定IP出现次数的解决方案
输入数据集
Time Source 2022-11-27 09:19:27 192.168.1.128 2022-11-27 09:19:27 152.199.19.161 2022-11-27 09:19:27 192.168.1.128 2022-11-27 09:19:27 192.168.1.128 2022-11-27 09:19:28 142.250.186.67 2022-11-27 09:19:29 192.168.1.128 2022-11-27 09:19:29 192.168.1.128 2022-11-27 09:19:30 192.168.1.128 2022-11-27 09:19:30 142.250.186.67
期望输出
Time Count 2022-11-27 09:19:27 3 2022-11-27 09:19:28 0 2022-11-27 09:19:29 2 2022-11-27 09:19:30 1
实现代码(基于Pandas)
步骤1:导入库并处理时间列
确保Time列被解析为datetime类型,方便后续按时间分组:
import pandas as pd # 构造示例数据(实际场景可替换为pd.read_csv/pd.read_excel读取文件) data = { 'Time': ['2022-11-27 09:19:27', '2022-11-27 09:19:27', '2022-11-27 09:19:27', '2022-11-27 09:19:27', '2022-11-27 09:19:28', '2022-11-27 09:19:29', '2022-11-27 09:19:29', '2022-11-27 09:19:30', '2022-11-27 09:19:30'], 'Source': ['192.168.1.128', '152.199.19.161', '192.168.1.128', '192.168.1.128', '142.250.186.67', '192.168.1.128', '192.168.1.128', '192.168.1.128', '142.250.186.67'] } df = pd.DataFrame(data) df['Time'] = pd.to_datetime(df['Time'])
步骤2:筛选目标IP并按秒计数
过滤出Source为192.168.1.128的行,然后以每秒为间隔分组统计数量:
# 筛选目标IP + 按秒分组计数 count_df = df[df['Source'] == '192.168.1.128'] \ .groupby(pd.Grouper(key='Time', freq='S')) \ .size() \ .reset_index(name='Count')
步骤3:补全时间序列并填充0
生成从数据最小时间到最大时间的完整每秒序列,将计数结果合并后,把无目标IP的秒数计数填充为0:
# 生成完整的时间范围(每秒一个节点) full_time_range = pd.date_range(start=df['Time'].min(), end=df['Time'].max(), freq='S') full_time_df = pd.DataFrame({'Time': full_time_range}) # 合并数据并填充缺失值为0 result = pd.merge(full_time_df, count_df, on='Time', how='left').fillna(0) # 将Count转为整数类型 result['Count'] = result['Count'].astype(int)
查看结果
运行print(result)即可得到期望输出:
Time Count 0 2022-11-27 09:19:27 3 1 2022-11-27 09:19:28 0 2 2022-11-27 09:19:29 2 3 2022-11-27 09:19:30 1
内容的提问来源于stack exchange,提问作者user20491079
相关产品推荐
相关产品推荐

