• 【python小练】0020


    第 0020 题: 登陆中国联通网上营业厅 后选择「自助服务」 --> 「详单查询」,然后选择你要查询的时间段,点击「查询」按钮,查询结果页面的最下方,点击「导出」,就会生成类似于 2014年10月01日~2014年10月31日通话详单.xls 文件。写代码,对每月通话时间做个统计。

    刚好用的是联通呢,科科。

    Ok,拿到数据了,保存为文件“comu.xls”,现在打算:

    1. 统计通话总时长

    2. 统计主叫和被叫次数

    3. 统计通话总费用

    4. pip了matplotlib,试着把数据做成图表(白pip了,py3自带pylab里包含了matplotlib)

    嗯,下面开工!

    Code:

    import xlrd
    import re
    from pylab import *
    
    
    def get_xls_data(filename):
    
         # 读取xls数据
         book = xlrd.open_workbook(filename)
         sheet = book.sheet_by_index(0)
         content = {}
         for i in range(sheet.nrows):
             content[i+1] = sheet.row_values(i)[1:]
             #print(content[i+1])
    
         print("Liez的3月话费单:")
    
         # 统计话费
         cost = 0
         for i in range(sheet.nrows-1):
             cost += float(content[i+2][7])
         print("通话费:", round(cost, 2),"")
    
         # 统计被叫主叫次数
         call = 0
         becall = 0
         for i in range(sheet.nrows-1):
             if(content[i+2][3] == "主叫"):
                 call += 1
             else:
                 becall += 1
         total = call + becall
         print("主叫",call,"次,被叫",becall,"次,共计",total,"次通话")
    
         # 统计通话时间
         time = {}
         for i in range(sheet.nrows-1):
             time[i] = content[i+2][1]
         day = {}
         for i in range(31):
            day[i+1] = 0
         rday = re.compile('-(d+?) ')
         for i in range(sheet.nrows-1):
            daycompile = rday.findall(content[i+2][1])
            t = int(daycompile[0])
            day[t] += 1
         daytimes = (list(day.values()))
         dates = (list(day.keys()))
    
         # 统计通话时长
         sec = 0
         min = 0
         for i in range(sheet.nrows-1):
              rsec = re.compile('(d+)秒')
              rmin = re.compile('(d+)分')
              seci = rsec.findall(content[i+2][2])
              mini = rmin.findall(content[i+2][2])
              sec += int(seci[0])
              if(len(mini)==1):
                   min += int(mini[0])
         if(sec >= 60):
             t = sec / 60
             sec = sec % 60
             min = min + t
         print("通话时长:%d分%d秒"%(min,sec))
    
         #三月日通话次数统计图
         plt.plot(dates, daytimes)
         grid(True)
         title("Call Times Every Day")
         plt.show()
    
         #根据被叫主叫次数作饼状图
         figure(2, figsize=(6,6))
         fracs = [call/total, becall/total]   # 饼状图按被叫和主叫分成两部分的比例
         labels = 'Call', 'Becall'
         pie(fracs, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90, colors = ("b", "y"))
         title("Call & Becall")
         show()
    
    
    get_xls_data("comu.xls")

    输出:

      Liez的3月话费单:
      通话费:15.15 元
      主叫 45 次,被叫 64 次,共计 109 次通话
      通话时长:193分40秒

     两个图表:

    ps:感觉这题除了麻烦还是麻烦= - =好在正则表达式用得开始溜起来啦(ง •̀ω•́)ง 

  • 相关阅读:
    css之选择器及性能优化
    css之font
    css之background
    Oracle 学习笔记(十)
    数据库脚本开发日志模板 —— 项目需求 A
    Java 程序动态替换 docx 模板中定制值的实现例子
    Quartz 定时器 Cron 表达式 怎么破?
    Tomcat 启动报错;ERROR: transport error 202: bind failed: Address already in use
    Oracle 学习笔记(九)
    Oracle 学习笔记(八)
  • 原文地址:https://www.cnblogs.com/liez/p/5410729.html
Copyright © 2020-2023  润新知