python 处理xls

之前我有写过一篇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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值