前言
手上有個停車系統的計時記錄表excel,需要對車輛的有效時長進行計算,但是有效時間隻有晚上20點到第二天10點,是以使用excel的自帶計算公式,感覺無從下手。于是就想到用python做這個資料統計。
準備工作
準備使用xlrd,xlwt, xlutils來對excel資料進行操作。
xlrd用來讀取excel資料;
xlwt用來寫入excel資料(後來發現無法做到追加);
xlutils用來寫入(追加)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')
到此資料的計算結束了。
效果圖如下: