一、.OUT文件概述

SWMM中.OUT输出文件为二进制文件,用记事本打开会呈现如下图所示的乱码状态。但是.OUT文件中有很多重要结果信息(例如:节点全模拟时段水深、侧向来水、出口总流量等数据),用官方提供的pyswmm库对.OUT文件进行解析。将二进制数据输出为Excel。

文件主要包括三种类型数据,节点类型数据、管道类型数据、汇水区类型数据。节点类型包括检查井、排口、调蓄池、分流器;管道类型包括管道、泵、孔口、堰、出口;汇水区包括汇水分区。节点输出数据包括:水深、水头、拦截容积、侧入流量、节点总入流量、节点溢流量及污染物,7个输出数据;管道输出数据包括:流量、水深、流速、Froude数、过流能力及污染物,6个输出数据;子汇水区输出数据包括:降雨量、积雪深度、蒸发量、入渗量、地表径流量、地下水径流量、地下水位、土壤含水量及污染物浓度,9个输出数据。

二、.OUT文件解析

01.OUT头文件解析,头文件包含以下几个数据:

版本号、流量单位、污染物单位、汇水分区数量、节点数量、管段数量、污染物数量、报告开始时间及报告结束时间。代码如下:

 # 文件初始化内容def push_s(self):file = str(self.lineEdit.text())start = time.time()output_Subcatch_data(file)end = time.time()all_time = "Subcatch数据导出时长为:" + str("%.3f" % (end - start)) + 's'with Output(file) as out:version = '版本号为:' + str(out.version)flow_units = "流量单位:" + out.units['flow']poll_units = "污染物单位:" + out.units['pollutant']sub_num = "汇水分区数量:" + str(len(out.subcatchments))nodes_num = "节点数量:" + str(len(out.nodes))links_num = "管段数量:" + str(len(out.links))poll_num = "污染物数量:" + str(len(out.pollutants))rep_start = "报告开始时间:" + str(out.start)rep_end = "报告结束时间:" + str(out.end)head_file_list = [version, flow_units, poll_units, sub_num, nodes_num, links_num, poll_num, rep_start,rep_end]

02管段输出数据解析

将管段模拟数据(流量、水深、流速等)输出到Excel中,方便后期处理。

输出结果:

代码如下:

def output_link_data(file):'''路径不能有中文字符,否则会报错。头文件内容读取可以做为一个装饰器F:\test_file_SWMM\Example1.out''''''所有管段模拟时间内数据输出'''with Output(file) as out:# data_dict = {}year_s = int(str(out.start)[0:4])month_s = int(str(out.start)[5:7])day_s = int(str(out.start)[8:10])hour_s = int(str(out.start)[11:13])if hour_s == 0:hour_s = hour_s + 1year_e = int(str(out.end)[0:4])month_e = int(str(out.end)[5:7])day_e = int(str(out.end)[8:10])hour_e = int(str(out.end)[11:13])data_list = []link_id = []for i in out.links:'''--------------------全模拟时段下单一管段流量数据--------------------'''ts = out.link_series(i, LinkAttribute.FLOW_RATE, datetime(year_s, month_s, day_s, hour_s), datetime(year_e, month_e, day_e, hour_e))time_index = []flow_index = []for index in ts:time_index.append(index)flow_index.append(ts[index])# dict_FLOW_RATE[index] = ts[index]# print(index, ts[index])dict_FLOW_RATE = {"time":time_index,'流量(flow_rate)':flow_index}data_FLOW_RATE = pd.DataFrame(dict_FLOW_RATE)# print(data_FLOW_RATE)'''--------------------全模拟时段下单一管段水深数据--------------------'''ts1 = out.link_series(i, LinkAttribute.FLOW_DEPTH, datetime(year_s, month_s, day_s, hour_s), datetime(year_e, month_e, day_e, hour_e))time_index1 = []flow_index1 = []for index in ts1:time_index1.append(index)flow_index1.append(ts1[index])# dict_FLOW_DEPTH[index] = ts1[index]dict_FLOW_DEPTH = {"time":time_index1,"水深(flow_depth)":flow_index1}data_FLOW_DEPTH = pd.DataFrame(dict_FLOW_DEPTH)# print(data_FLOW_DEPTH.index)# u = input()'''--------------------全模拟时段下单一管段流速数据--------------------'''ts2 = out.link_series(i, LinkAttribute.FLOW_VELOCITY, datetime(year_s, month_s, day_s, hour_s), datetime(year_e, month_e, day_e, hour_e))time_index2 = []flow_index2 = []for index in ts2:time_index2.append(index)flow_index2.append(ts2[index])# dict_FLOW_DEPTH[index] = ts1[index]dict_FLOW_VELOCITY = {"time": time_index2, "流速(flow_velocity)": flow_index2}data_FLOW_VELOCITY = pd.DataFrame(dict_FLOW_VELOCITY)# print(data_FLOW_DEPTH.index)'''--------------------全模拟时段下单一管段体积数据--------------------'''ts3 = out.link_series(i, LinkAttribute.FLOW_VOLUME, datetime(year_s, month_s, day_s, hour_s), datetime(year_e, month_e, day_e, hour_e))time_index3 = []flow_index3 = []for index in ts3:time_index3.append(index)flow_index3.append(ts3[index])dict_FLOW_VOLUME = {"time": time_index3, "体积(flow_volume)": flow_index3}data_FLOW_VOLUME = pd.DataFrame(dict_FLOW_VOLUME)'''--------------------全模拟时段下单一管段过流能力数据--------------------'''ts4 = out.link_series('16', LinkAttribute.CAPACITY, datetime(year_s, month_s, day_s, hour_s), datetime(year_e, month_e, day_e, hour_e))time_index4 = []flow_index4 = []for index in ts4:time_index4.append(index)flow_index4.append(ts4[index])dict_CAPACITY = {"time": time_index4, "过流能力(capacity)": flow_index4}data_CAPACITY = pd.DataFrame(dict_CAPACITY)'''--------------------全模拟时段下单一管段污染物数据--------------------'''ts5 = out.link_series(i, LinkAttribute.POLLUT_CONC_0, datetime(year_s, month_s, day_s, hour_s), datetime(year_e, month_e, day_e, hour_e))time_index5 = []flow_index5 = []for index in ts5:time_index5.append(index)flow_index5.append(ts5[index])dict_POLLUT_CONC_0 = {"time": time_index5, "水质(pollut_conc)": flow_index5}data_POLLUT_CONC_0 = pd.DataFrame(dict_POLLUT_CONC_0)'''--------------------数据合并--------------------'''data_all1 = pd.merge(data_FLOW_RATE,data_FLOW_DEPTH,on='time',how='outer')data_all2 = pd.merge(data_all1,data_FLOW_VELOCITY,on='time',how='outer')data_all3 = pd.merge(data_all2,data_FLOW_VOLUME,on='time',how='outer')data_all4 = pd.merge(data_all3, data_CAPACITY, on='time', how='outer')data_all = pd.merge(data_all4, data_POLLUT_CONC_0,on='time', how='outer')link_id.append(i)data_list.append(data_all)data_list1 = pd.concat(data_list,axis=1,keys=link_id)data_list1.to_excel(file[:-4] + '_links.xlsx')

节点及汇水分区输出数据解析类似上述操作,不在赘述。

如需全部代码,请关注微信公众号“智慧水务建模”,回复 “out代码” 获取

用python解析SWMM的.OUT输出文件相关推荐

  1. Python解析CANoe录制的blf文件asc文件通用方法

    Python解析CANoe录制的blf文件&asc文件通用方法 一.背景     由于很多时候我们在录制日志文件的时候更愿意选择BLF文件,至少目前我见到的很多公司都是使用的BLF文件来作为最 ...

  2. Python解析CANoe录制的asc文件

    Python解析CANoe录制的asc文件 一.背景     由于很多时候我们需要单纯分析一些报文数据,筛选或者一些故障报文,这个时候,用CANoe打开太占用设备了,而且只能过滤到某一帧报文,当我们能 ...

  3. 使用python解析Wordpress导出的xml文件

    在用wordpress导出日志时,得到的往往是xml文件,具体形式如下: <?xml version="1.0" encoding="UTF-8"?> ...

  4. 用Python解析WinMerge生成的Patch文件

    这个代码是本人第一次用Python写的包含Class的代码. 该解析之前用VBA写过,刚刚学习了五天的Python, 检验一下自己学习的成果,也算给五一长假画上一个分号. 写的比较烂,自己看着都难受. ...

  5. Python解析access数据库(mdb文件或者accdb文件)

    在工作中遇到这样一个问题,需要对上百个mdb文件进行数据统计,mdb文件实际上就是access数据库,使用微软的access工具即可打开. 但是我电脑上没有安装access数据库,而且官方的安装包还要 ...

  6. python在windows 输入和输出文件_Python文件、目录和输入输出操作

    读取键盘的输入 Python提供了input()内置函数从标准输入读入一行文本,默认的标准输入是键盘.input可以接收一个Python表达式作为输入,并将运算结果返回,如下所示: biotest@b ...

  7. python 解析下载的二进制Excel文件内容

    先描述一波问题场景: 需求是项目中调接口会下载Excel文件,然后解析出Excel文件中固定行列的值即可.如果直接读取Excel文件,使用xlrd库即可.但是调下载接口返回的二进制的内容~~~,如下: ...

  8. Python 解析二维码 输出文本

    一.安装要用到的模块: pip install qrcode pip install pyzbar 二.示例代码如下: import os import requests from io import ...

  9. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

最新文章

  1. linux常用命令linux自动挂载WinXP系统下的分区
  2. 只知道ajax?你已经out了
  3. mysql 分析函数_MySQL分析函数实现
  4. 机器学习算法之线性回归
  5. MSSQL游标的原理及示例
  6. php编写一个投票程序,实例学习PHP之投票程序篇(一)
  7. 8个数据清洗Python代码,复制可用,最长11行 | 资源
  8. Vue 组件间的传值(通讯)
  9. VMware Workstation 历史版本下载
  10. 如何更有效的开发中东市场客户?【干货】想拿土豪国大订单看过来!
  11. EasyRecovery免费版一键数据恢复还原软件
  12. 中国移动飞信的研究 笔记二
  13. 猫眼电影诛仙评论爬取并进行数据分析
  14. 工业相机镜头如何选择
  15. java autoconf_Centos7安装autoconf
  16. 什么是java修饰符_java修饰符是什么?
  17. GE董事长兼首席执行官杰夫.伊梅尔特上任第一年致诸位股东、客户与员工(中英文)
  18. 较为简洁明了的KMP算法解释
  19. Git实用教程 4.0:回到过去
  20. 电视hdr测试软件,HDR测试:各家效果差异太夸张_索尼 KD-65A1_液晶电视评测-中关村在线...

热门文章

  1. 《数字短片创作(修订版)》——第2章 创造独特的角色、主题和视觉隐喻 创造强有力的人物角色...
  2. VUE之数字输入最大值何最小值的控制
  3. 腾讯:站在“山寨”肩膀上的巨人
  4. 工匠社联手王者荣耀打造盾山机器人,ChinaJoy首亮相
  5. 图像常见的分辨率大小
  6. 深圳python编程线上培训
  7. 恰如其分的批评与莫名其妙的表扬
  8. CentOS 6.0正式版发布下载地址
  9. PyTorch深度学习60分钟闪电战:03 神经网络
  10. python 魔兽世界升级脚本_Python 实现数据库更新脚本的生成方法