一、需求
aliyun-ddns.html文件里有服务器相关的一些日志信息,具体如下:
需求:找到通网后的第一个日志和断网前的最后一个日志,然后提取 date 列的时间做减法,获得本次断网时间,之后用同样的方法统计每次的断网时间,最后计算总的断网次数和断网时间的平均值。
二、python代码实现
pd.read_html()方法,可以直接将网页上这种表格型数据转成DataFrame
importpandasaspd# pd.read_html()方法,可以直接将网页上这种表格型数据转成DataFramedf=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 行则为通网后的第一个日志。
算时间差
importpandasaspdtime_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()) # 总的秒数运行结果如下:0days00:31:06Components(days=0, hours=0, minutes=31, seconds=6, milliseconds=0, microseconds=0, nanoseconds=0) 003161866.0
完整实现如下
importpandasaspd# pd.read_html()方法,可以直接将网页上这种表格型数据转成DataFramedf=pd.read_html('aliyun-ddns.html')[0] count= [] # 记录总的断网 通网次数 [(断网日志的行索引, 通网日志的行索引)...]flag=0record= [] # 记录一次的断网 同网 (断网日志的行索引, 通网日志的行索引)foriinrange(len(df)): try: iflen(df.iloc[i+1, ::]['content']) <45andlen(df.iloc[i, ::]['content']) >50: # 断网前最后一个日志record.append(i) flag+=1iflen(df.iloc[i+1, ::]['content']) >50andlen(df.iloc[i, ::]['content']) <45: # 通网后第一个日志record.append(i+1) flag+=1ifflag==2: count.append(record) flag=0# 置为0record= [] # 置为空exceptIndexError: # 超界 说明遍历统计结束passprint(count)
从统计的结果任选两条进行查看,对比看看是否找对。
对比可以发现,查找结果完全正确。
# 统计断网次数print(f'断网次数:{len(count)}')
# 计算时间差data= [] foritemincount: 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)) # 数据保存到Exceldf.to_excel('aliyun-ddns.xlsx') datas.to_excel('cal_datas.xlsx')
从这批数据中统计得到,断网次数为97,平均断网时间为6133.938s。
保存每次记录如下: