我从一个应用程序的日志中提出每天的某个数据。然后通过Execl对数据进行处理,得到数据分布和趋势图表。下面记录使用Python从日志中挑出数据、使用Python把数据存储为Excle文件、使用Excle处理数据生成图表的过程。

使用Python从日志中挑选自己要的数据

使用正则表达式从日志中提出有日期和数据关键字的行。然后按天求和。

import os
import re

files = []
sizes = {} #{'dddd-dd-dd':size,}

pickFileSizeLinesPattern = r'(?i)(\d\d\d\d-\d\d-\d\d)\s*02:.*?Downloading.*?Bytes:\s*(\d*)\s'
for d, ds, fs in os.walk('.'):
    logfiles = [x for x in fs if x.startswith('output.log')]
    files += logfiles

for f in files:
    with open(f, 'r') as fhander:
        lines = fhander.readlines()
        for l in lines:
            result = re.search(pickFileSizeLinesPattern, l)
            if result:
                date = result.group(1)
                size = result.group(2)
                sizes[date] = sizes.get(date, 0) + int(size)/1024/1024

这段代码把日志中满足条件的行选出来,例如:

2017-01-11 02:07:15,977 INFO Downloading: xxxxx.exe Bytes: 65658928
2017-01-11 02:07:16,961 INFO Downloading: xxxxx_64.exe Bytes: 68804008

然后求和,把每天的值放到dict中。如:{'2017-01-11':8888}

使用Python把数据写入到Excel文件中

选择使用xlwt。安装:

pip install xlwt

使用方法:

import xlwt

excel = xlwt.Workbook()
dsheet = excel.add_sheet('daily')

dsheet.write(0,0,'Date')
dsheet.write(0,1,'Size')

for index, val in enumerate(sorted(sizes)):
    date = val
    size = sizes[date]
    dsheet.write(index+1,0,date)
    dsheet.write(index+1,1,size)
    
excel.save('downloaded.xls')

最终生成的xls有的sheet,而且有2列的数据。如下图:

excle data

Excel中数据处理

计算每天的累加值

公式: SUM(B$2:B2)

把公式所在单元格向下拉,生成逐天累加结果。B$2表示每次都从B2开始。例如拉到第三个单元格,公式变成 SUM(B$2:B4)

效果如下图:

excle data sum

计算每月的累加值

公式: SUMPRODUCT((YEAR(A2:A2000)=D2)*(MONTH(A2:A2000)=E2)*B2:B2000)

  • SUMPRODUCT函数是处理多个数组,先求数组间的乘积,然后求和。例如SUMPRODUCT({1,0,1},{2,2,2}),先算乘积,得到SUMPRODUCT({2,0,2}),最终结果是4
  • YEAR和MONTH函数获取日期格式数据的年份和月份。YEAR(A2:A2000)=D2判断A2中的年份是否和D2相等。得到一个从2到2000的数组{TRUE,TRUE,FALSE,...}
  • SUMPRODUCT能把{TRUE,TRUE,FALSE,...}自动转成{1,1,0,...}
  • TIPS: 强制把TRUE,FALSE转成1,0的方法:--(YEAR(A2:A2000)=D2)

效果如下图:

excle data sumproduct

插入带趋势线的图表

选择月数据插入折线图表。在生成的图表上右键,选择添加趋势线。在趋势线上右键,选择设置趋势线格式。在趋势预测那里可输入向前或向后多少周期。

效果如下图:

excle chart


参考: