之前我有写过一篇C++处理xls,不过,由于学习了python,就像用python写写,正好一个同学给了我一个8万多的数据让处理一下,简单说格式如下:
6 | 2014-3-22 0:00 | 4.4 | 117 |
7 | 2014-3-22 0:00 | 4.4 | 114 |
8 | 2014-3-22 0:00 | 3.9 | 116 |
9 | 2014-3-22 0:00 | 3.8 | 115 |
10 | 2014-3-22 0:00 | 3.7 | 110 |
11 | 2014-3-22 0:00 | 3.3 | 110 |
12 | 2014-3-22 0:00 | 3.3 | 109 |
13 | 2014-3-22 0:00 | 3.3 | 272 |
14 | 2014-3-22 0:00 | 3 | 286 |
15 | 2014-3-22 0:00 | 3 | 285 |
16 | 2014-3-22 0:00 | 3.2 | 289 |
17 | 2014-3-22 0:00 | 3 | 287 |
18 | 2014-3-22 0:00 | 3.3 | 287 |
19 | 2014-3-22 0:00 | 3.4 | 287 |
20 | 2014-3-22 0:00 | 3.8 | 287 |
21 | 2014-3-22 0:01 | 3.7 | 286 |
22 | 2014-3-22 0:01 | 3.6 | 289 |
23 | 2014-3-22 0:01 | 3.6 | 288 |
24 | 2014-3-22 0:01 | 3.5 | 288 |
25 | 2014-3-22 0:01 | 3.3 | 288 |
26 | 2014-3-22 0:01 | 3.7 | 292 |
27 | 2014-3-22 0:01 | 3.4 | 289 |
28 | 2014-3-22 0:01 | 3.3 | 289 |
29 | 2014-3-22 0:01 | 3.5 | 291 |
30 | 2014-3-22 0:01 | 3.3 | 288 |
这个思路不难,就是,对比时间,然后将时间是同一分钟的加起来求一个均值就OK了。C++写代码的话我想也会很容易。这里正好不是python吗,于是用python来写一个,同时呢也做一个备份。
1、python呢,首先需要下载两个库,xlwt和xlrd,一个是写一个是读xls
地址:
https://pypi.python.org/pypi/xlrd
https://pypi.python.org/pypi/xlwt
下载解压,然后在这个目录下面,使用python setup.py install就可以了。你可以在IDLE试着import xlrd试试,不报错就说明安装好了。
2、写代码,这个呢,网上有很多很多,一抓一大把的测试代码,然后你只需要修改一下就可以成为自己的了。我这里也贴出我自己的代码。然后说说我在做的过程中遇到的问题。
第一、时间问题,
从xls读出来的时间,是一个float类型的,怎么办?我不能要这个时间吧,不然怎么比较两个数据是不是同一分钟的?网上也是各种资料,但是解决办法却是非常的简单。xlrd自带的函数
a = xlrd.xldate_as_tuple(time, 0)
a就是一个元组了。
比如,xls里面的时间是2014-05-22 19:02:11
那么,你直接
time = sh.cell_value(i,1)
获取这个时间,然后print是一个float类型的数字,但是经过a = xlrd.xldate_as_tuple(time, 0)函数转换,a输出就是一个元组,(2014,5,22,19,2,11,-,-)这个元组后面还有几个,我们可以不管,我们只需要知道前面几个代表的意思就够了。明显时间改怎么比较显而易见了吧。我们也不需要转换什么格式。
第二,xlwt这个最多支持的36656,向xls写数据的时候,千万注意了
ws.write(k,0,time_out)这个代码,k不能超过36656,如果超过了,那么重新建一个sheet,要么,往后各几列继续写。不然会报错。
其中遇到的这两个问题最当人头疼。不过,我的代码也是很乱,不过列出来吧。供参考。
import xlrd
import xlwt
import time
#求均值
def jun():
fname = '1214.xls'
bk = xlrd.open_workbook(fname)
shxrange = range(bk.nsheets)
try:
sh = bk.sheet_by_name("wind")
except:
print "no sheet in %s named Sheet1" % fname
return None
nrows = sh.nrows
ncols = sh.ncols
print "nrows %d, ncols %d" % (nrows,ncols)
wb = xlwt.Workbook()
#添加一个sheet
ws = wb.add_sheet('speed')
ws.write(0,0,'time')
ws.write(0,1,'speed')
ws.write(0,2,'speed-wind')
all = 0
wind = 0
k = 1
count = 0
com = ()
flag = 0
stat = 0
for i in range(1,nrows):
count = count + 1
time = sh.cell_value(i,1)
a = xlrd.xldate_as_tuple(time, 0)
speed = sh.cell_value(i,2)
w = sh.cell_value(i,3)
#处理第一个数据
if flag == 0:
com = a
all = all + speed
wind = wind + w
flag = 1
continue
if flag == 1:
if a[3] == com[3] and a[4] == com[4]:
all = all + speed
wind = wind + w
else:#处理同一分钟的数据
time_out = str(com[0])+'-'+str(com[1])+'-'+str(com[2])+' '+str(com[3])+':'+str(com[4])+':00'
print time_out
j = all/(count-1)
m = wind/(count-1)
print j
ws.write(k,0,time_out)
ws.write(k,1,j)
ws.write(k,2,m)
k = k + 1
all = speed
wind = w
com = a
count = 1
#处理最后一分钟数据
time_out = str(com[0])+'-'+str(com[1])+'-'+str(com[2])+' '+str(com[3])+':'+str(com[4])+':00'
j = all/(count)
m = wind/(count)
print j
ws.write(k,0,time_out)
ws.write(k,1,j)
ws.write(k,2,m)
wb.save('result.xls')
if __name__ == '__main__':
jun()