python 办公自动化系列 (1) 从22053条数据中统计断网次数并计算平均断网时间
时间:2022-07-25
本文章向大家介绍python 办公自动化系列 (1) 从22053条数据中统计断网次数并计算平均断网时间,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文章目录
一、需求
aliyun-ddns.html文件里有服务器相关的一些日志信息,具体如下:
需求:找到通网后的第一个日志和断网前的最后一个日志,然后提取 date 列的时间做减法,获得本次断网时间,之后用同样的方法统计每次的断网时间,最后计算总的断网次数和断网时间的平均值。
二、python代码实现
pd.read_html()方法,可以直接将网页上这种表格型数据转成DataFrame
import pandas as pd
# pd.read_html()方法,可以直接将网页上这种表格型数据转成DataFrame
df = pd.read_html(r'aliyun-ddns.html')[0]
df
运行效果如下:
可以看到,总共有22053条数据,人工去找断网前最后一个日志和通网后的第一个日志,再算断网时间,想起来都挺费劲的,还很无聊。
Python自动化办公当然是为了在处理这些简单、重复、有规律的任务时,能够帮助我们解放双手,让复杂的工作自动化。
不过在写自动化脚本之前也要先拆分任务,明确思路再进行操作。
任务拆解
如何找到断网前最后一个日志和通网后的第一个日志
# 通网的日志 content列的字符串
len('2020/08/25 13:30:58 m.hlnas.top 112.226.49.5 [中国 山东 青岛]')
# 断网的日志 content列里的字符串
len('2020/08/24 16:59:03 Query IP Format error.')
len('2020/08/25 12:30:55 m.hlnas.top')
分析通网和断网的日志里content列里内容的长度,找断网前最后一个日志和通网后的第一个日志的基本思路如下:
- 第 i 行 content列里字符串长度大于50,i+1 行content列里字符串长度小于45,这个第 i 行则为断网前的最后一个日志。
- 第 i 行 content列里字符串长度小于45,i+1 行content列里字符串长度大于50,这个第 i+1 行则为通网后的第一个日志。
算时间差
import pandas as pd
time_delta = pd.to_datetime('2020-08-25 04:35:56') - pd.to_datetime('2020-08-25 04:04:50')
print(time_delta)
print(time_delta.components)
print(time_delta.components.days)
print(time_delta.components.hours)
print(time_delta.components.minutes)
print(time_delta.components.seconds)
print(time_delta.total_seconds()) # 总的秒数
运行结果如下:
0 days 00:31:06
Components(days=0, hours=0, minutes=31, seconds=6, milliseconds=0, microseconds=0, nanoseconds=0)
0
0
31
6
1866.0
完整实现如下
import pandas as pd
# pd.read_html()方法,可以直接将网页上这种表格型数据转成DataFrame
df = pd.read_html('aliyun-ddns.html')[0]
count = [] # 记录总的断网 通网次数 [(断网日志的行索引, 通网日志的行索引)...]
flag = 0
record = [] # 记录一次的断网 同网 (断网日志的行索引, 通网日志的行索引)
for i in range(len(df)):
try:
if len(df.iloc[i+1, ::]['content']) < 45 and len(df.iloc[i, ::]['content']) > 50: # 断网前最后一个日志
record.append(i)
flag += 1
if len(df.iloc[i+1, ::]['content']) > 50 and len(df.iloc[i, ::]['content']) < 45: # 通网后第一个日志
record.append(i+1)
flag += 1
if flag == 2:
count.append(record)
flag = 0 # 置为0
record = [] # 置为空
except IndexError: # 超界 说明遍历统计结束
pass
print(count)
从统计的结果任选两条进行查看,对比看看是否找对。
对比可以发现,查找结果完全正确。
# 统计断网次数
print(f'断网次数:{len(count)}')
# 计算时间差
data = []
for item in count:
disconnection_time = df.loc[item[0], ::]['date'] # 断网时间
connection_time = df.iloc[item[1], ::]['date'] # 通网时间
delta = (pd.to_datetime(disconnection_time) - pd.to_datetime(connection_time)).total_seconds() # 总秒数
data.append({'断网时间': disconnection_time, '通网时间': connection_time, '时间差(秒)': delta})
datas = pd.DataFrame(data)
datas.head(8)
# 求断网时间的平均值
averge = datas['时间差'].mean()
print('断网时间平均值:{:.3f}s'.format(averge))
# 数据保存到Excel
df.to_excel('aliyun-ddns.xlsx')
datas.to_excel('cal_datas.xlsx')
从这批数据中统计得到,断网次数为97,平均断网时间为6133.938s。
保存每次记录如下:
作者:叶庭云
公众号:微信搜一搜【修炼Python】 分享Python爬虫、数据分析、数据可视化、机器学习有关知识和实例;也分享实用的资料教程、软件工具、学习文档和简历模板。发现求知的乐趣,在不断总结和学习中进步。坚持输出优质文章,期待你的关注,一起交流学习,互相成就。
发现求知的乐趣,在不断总结和学习中进步,与诸君共勉。
- [喵咪BELK实战(3)] logstash+filebeat搭建
- Dubbo源码解析 —— Router
- 【死磕Java并发】—–深入分析volatile的实现原理
- phalcon-入门篇3(优美的URL与Config)
- 数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED
- 熔断器 Hystrix 源码解析 —— 命令执行(二)之执行隔离策略
- phalapi-入门篇4(国际化高可用和自动生成文档)
- 用JavaScript动态输出的JS脚本不能执行
- Dubbo源码解析 —— 服务暴露原理
- [Golang软件推荐] RSA公私钥加解密(解决Golang私钥加密公钥解密问题)
- [喵咪大数据]Hive+Hbase关联
- 再战子域共享Cookie问题
- [喵咪大数据]Presto查询引擎
- 如何在5分钟内做出你的第一个开源贡献
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php 使用mpdf实现指定字段配置字体样式的方法
- 虚拟机中CentOS7设置固定IP地址的方法
- CentOs下手动升级node版本的办法
- php设计模式之抽象工厂模式分析【星际争霸游戏案例】
- PHP使用PDO、mysqli扩展实现与数据库交互操作详解
- Linux中的who命令实例介绍
- php获取本年、本月、本周时间戳和日期格式的实例代码
- Smarty缓存机制实例详解【三种缓存方式】
- 详解在Ubuntu上的Apache配置SSL(https证书)的正确姿势
- php设计模式之建造器模式分析【星际争霸游戏案例】
- Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
- PHP容器类的两种实现方式示例
- Linux下Mysql定时任务备份数据的实现办法
- PHP抽象类和接口用法实例详解
- php+lottery.js实现九宫格抽奖功能