天天看點

python統計excel資料,停車系統有效時長前言準備工作1.擷取excel基礎資訊得到每一列的車輛進出時間,并計算時間差把結果寫入excel表格

前言

手上有個停車系統的計時記錄表excel,需要對車輛的有效時長進行計算,但是有效時間隻有晚上20點到第二天10點,是以使用excel的自帶計算公式,感覺無從下手。于是就想到用python做這個資料統計。

準備工作

準備使用xlrd,xlwt, xlutils來對excel資料進行操作。

xlrd用來讀取excel資料;

xlwt用來寫入excel資料(後來發現無法做到追加);

xlutils用來寫入(追加)excel資料。

1.擷取excel基礎資訊

excel表格如下:

python統計excel資料,停車系統有效時長前言準備工作1.擷取excel基礎資訊得到每一列的車輛進出時間,并計算時間差把結果寫入excel表格

通過以下代碼得到基礎資料行列數

#打開excel表格,formatting_info=true 可以保證保證原有格式不變
workbook = xlrd.open_workbook(filename,formatting_info=True)
#擷取excel下所有的sheets
sheets = workbook.sheet_names()
#擷取第一個sheet
worksheet = workbook.sheet_by_name(sheets[0])
#得到總行數和總列數
ncols_old = worksheet.ncols
nrows_old = worksheet.nrows
#copy原有excel表格資料
new_workbook = copy(workbook)
#擷取新的excel第一個sheet
new_worksheet = new_workbook.get_sheet(0)
           

得到每一列的車輛進出時間,并計算時間差

檢視表格發現:進場時間和出場時間分别在第8列和第9列。

def calculate_data(sheet, row):
    enter_time = sheet.cell_value(row,8)	#得到進場時間
    exit_time = sheet.cell_value(row,9)		#得到出場時間
    if enter_time == '' or exit_time == '':		#某些行為空,為空直接跳過
        return datetime.timedelta(hours=0)
#因為得到的都是string,需要轉換為datetime便于統計時間差
#start_20為入場目前的20點的時間
    start_20 = datetime.datetime.strptime(enter_time[:10], "%Y-%m-%d") + datetime.timedelta(hours=20)
#start_10為入場目前的10點的時間
    start_10 = datetime.datetime.strptime(enter_time[:10], "%Y-%m-%d") + datetime.timedelta(hours=10)
#end_20為出場目前的20點的時間
    end_20 = datetime.datetime.strptime(exit_time[:10], "%Y-%m-%d") + datetime.timedelta(hours=20)
#end_10為出場目前的10點的時間
    end_10 = datetime.datetime.strptime(exit_time[:10], "%Y-%m-%d") + datetime.timedelta(hours=10)
#enter_time 入場時間
    enter_time = datetime.datetime.strptime(enter_time, "%Y-%m-%d %H:%M:%S")
#exit_time 出場時間
    exit_time = datetime.datetime.strptime(exit_time, "%Y-%m-%d %H:%M:%S")
    result = None
#delta 為入場時間和出場時間(不考慮時分秒)的時間差,機關天,便于後續的計算
    a = exit_time - datetime.timedelta(hours=exit_time.hour, minutes=exit_time.minute, seconds=exit_time.second)
    b = enter_time - datetime.timedelta(hours=enter_time.hour, minutes=enter_time.minute, seconds=enter_time.second)
    delta = (a - b).total_seconds()/86400
#後續的條件判斷就是計算特定時間内的停車時長,有興趣可以看看,沒興趣可以直接略過,最後傳回一個result計算每行的時間差
    if enter_time < start_10:
        if exit_time < end_10:
            result = exit_time - enter_time - datetime.timedelta(hours=10*delta)
        elif exit_time > end_20:
            result = exit_time - enter_time - datetime.timedelta(hours=10*delta+10)
        else:
            result = start_10 - enter_time + datetime.timedelta(hours=14*delta)
    elif enter_time > start_20:
        if exit_time < end_10:
            result = exit_time - enter_time - datetime.timedelta(hours=10*delta-10)
        elif exit_time > end_20:
            result = exit_time - enter_time - datetime.timedelta(hours=10*delta)
        else:
            result = end_10 - enter_time - datetime.timedelta(hours=10*delta-10)
    else:
        if exit_time < end_10:
            result = exit_time - start_20 - datetime.timedelta(hours=10*delta-10)
        elif exit_time > end_20:
            result = exit_time - start_20 - datetime.timedelta(hours=10*delta)
        else:
            result = datetime.timedelta(hours=14*delta)
    return result
           

把結果寫入excel表格

因為車輛的資料是第8行開始,是以就加了7。

time_list = []
total_time = datetime.timedelta(hours=0)
for i in range(7, nrows_old):
    tmp = calculate_data(worksheet, i)	#計算每一行的停車時長
    total_time += tmp		#累計總時長
    time_list.append(str(tmp))	#添加到時長list
for i in range(nrows_old-7):
	#循環寫入每一行的停車時長
    new_worksheet.write(i+7, 1+ncols_old, time_list[i])
#寫入總時長
new_worksheet.write(nrows_old, 1+ncols_old, str(total_time))
#儲存為output.xls
new_workbook.save('output.xls')
           

到此資料的計算結束了。

效果圖如下:

python統計excel資料,停車系統有效時長前言準備工作1.擷取excel基礎資訊得到每一列的車輛進出時間,并計算時間差把結果寫入excel表格