Python自动化办公实战,上万数据中统计断网次数并计算平均断网时间

文章目录

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771

一、需求

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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

从这批数据中统计得到,断网次数为97,平均断网时间为6133.938s。

保存每次记录如下:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值