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

Solution: Total Call Time, Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# @Date : 2015-03-29 10:18:02
# @Author : NSSimacer
# @Version : 1.0
import sys
import re
from xlrd import open_workbook
# 设置系统编码为 UTF-8,处理中文乱码问题
reload(sys)
sys.setdefaultencoding('utf-8')
def load_data(f_path):
'''
从 Excel 文件中读取通话时长数据,以 list 格式返回
'''
workbook = open_workbook(f_path, encoding_override='utf-8')
sheet = workbook.sheet_by_name('2015年02月语音通信')
return [item.value for item in sheet.col_slice(4, 1, sheet.nrows)]
def total_call_time(call_time):
'''
计算总的通话时长
'''
time_regex = re.compile(r'\d+') # 匹配每条通话记录中的数字
hour = 0
minute = 0
second = 0
for item in call_time: # 根据数字个数累加时分秒
time = map(int, time_regex.findall(item))
if len(time) == 1:
second += time[0]
if len(time) == 2:
second += time[1]
minute += time[0]
if len(time) == 3:
second += time[2]
minute += time[1]
hour += time[0]
if second >= 60: # 进位
minute += second / 60
second %= 60
if minute >= 60:
hour += minute / 60
minute %= 60
return hour, minute, second
def main():
f_path = '2015-02-call-detail.xls'
call_time = load_data(f_path)
print 'Total Call Time: %s hours, %s minutes, %s seconds'\
% (total_call_time(call_time))
if __name__ == '__main__':
main()

主要目的还是用 Python 去操作 Excel 文件,这里只需要读取出“通话时间”这一列数据 sheet.col_slice(self, col_index, start_index, end_index),然后对通话时间进行累加即可。不太清楚有什么比较好的方法格式化时间然后直接相加,这里用了正则表达式匹配每条通话记录里的数字,根据数字个数,累加时分秒。

通话记录的格式是:

起始时间 | 通话地点 | 呼叫类型 | 对方号码 | 通话时长 | 通话类型 | 通话费
--- | --- | --- | --- | --- | --- | --- 
2015-02-28 15:26:39 | 抚州 | 被叫 | sssssssssss | 2分51秒 | 国内漫游 | 0.00

题目来源:Python 练习册,每天一个小程序 THX!