数据准备
为保护数据隐私,去除一些敏感信息,如下图所示:
这里为了后续代码方便分析,(1)按照桩号将数据升序排序;(2)在桩号数据的头尾两端添加任意桩号(如表中行1于行13)。
代码
这里以2公里为一个路段进行统计,统计路段的事故数、伤亡人数和路产损失等数据,并将结果输出到新表格,代码如下:
import xlrd
import xlwt
# 读取Excel文件
path = "C:/Users/.............xls"
workbook = xlrd.open_workbook(path)
Section_len = 2 # 以2km为一个路段,可以改成其他长度
road_start = 1762 # 起始桩号
# 选择sheet
sheet_input = workbook.sheet_by_name("sheet1")
# 获取行数和列数
num_rows = sheet_input.nrows
num_cols = sheet_input.ncols
print("Number of rows:", num_rows)
print("Number of columns:", num_cols)
# 获取列(按列索引获取)
Stake_mark = sheet_input.col_values(4)
Injured = sheet_input.col_values(9)
Serious_wound = sheet_input.col_values(10)
Death = sheet_input.col_values(11)
Road_loss = sheet_input.col_values(12)
# 定义统计量
Section_count = 0 # 路段事故数统计
Injured_and_Death = 0 # 路段伤亡统计
Road_loss_count = 0 # 路段路产损失统计
num_Injured_and_Death = 0 # 有伤亡的事故数
num_Road_loss_count = 0 # 有路产损失的事故数
# 创建excel表格类型文件,保存导出的数据
book_output = xlwt.Workbook(encoding='utf-8', style_compression=0)
# 在excel表格类型文件中建立一张sheet表单
sheet_output = book_output.add_sheet('sheet1', cell_overwrite_ok=True)
# 自定义列名
col = ['路段编号', '事故数', '伤亡人数', '路产损失', '伤亡事故数', '路产损失事故数']
for c in range(len(col)):
sheet_output.write(0, c, col[c]) # 在第0行写入列名
# 遍历每一行,获取数据
for row in range(1, num_rows):
NO_i_p = int((int(Stake_mark[row - 1][0:4]) - road_start) / Section_len) # 上一行的路段编号
NO_i = int((int(Stake_mark[row][0:4]) - road_start) / Section_len) # 该桩号属于第i路段
if row != 1 and NO_i != NO_i_p: # 如果当前桩号与上一行的路段不同,就进行数据写入
# 依次写入数据
sheet_output.write(NO_i-1, 0, "K" + str(road_start + (NO_i-1) * Section_len) + "-K" + str(road_start + NO_i * Section_len - 1))
sheet_output.write(NO_i-1, 1, Section_count)
sheet_output.write(NO_i-1, 2, Injured_and_Death)
sheet_output.write(NO_i-1, 3, Road_loss_count)
sheet_output.write(NO_i-1, 4, num_Injured_and_Death)
sheet_output.write(NO_i-1, 5, num_Road_loss_count)
# 重置局部变量
Section_count = 0
Injured_and_Death = 0
Road_loss_count = 0
num_Injured_and_Death = 0
num_Road_loss_count = 0
Section_count += 1
Injured_and_Death = Injured_and_Death + Injured[row] + Serious_wound[row] + Death[row]
Road_loss_count += Road_loss[row]
if Injured[row] != 0 or Serious_wound[row] != 0 or Death[row] != 0:
num_Injured_and_Death += 1
if Road_loss[row] != 0:
num_Road_loss_count += 1
# 保存文件
save_path = 'C:/Users/..............output.xls'
book_output.save(save_path)
输出结果
输出的统计分析结果如下图所示: