python提取各个扇区不同机位点风速风向表
背景介绍
我们依然来处理windsim导出的风廓线信息(Tools->Export vertical profile)在前面perl拆分大文件一文中我们得到各个机位点在不同扇区下的物理量信息,并存放在一个excel表里头
而其实我们更关心的是轮毂高度处的风速风向信息,即形成下面的轮毂高度处不同扇区和机位点的风速风向
每个风场均需要修改对应风机信息!
技术分解
- 遍历
- 建立一个扇区表和特征物理量【标识信息即可】, 该特征物理量为velocity表示提取偶数行,物理量为Angle表示提取奇数行
- 对特定的物理量进行atan2计算,atan2(vx,vy)得到[-pi,+pi]范围值,加上180°就变成了[0,2pi]
- 导出数据
技术实现
- 建立扇区表, 即excel表列信息
columnMe=['0','22','45','67','90','112','135','157','180','202','225','247','270','292','315','337'];
-
建立机位风速、风向信息,即excel表行信息
indexMe=["T12_Velocity", "T12_Angle", "T11_Velocity", "T11_Angle", "T10_Velocity", "T10_Angle", "T1_Velocity", "T1_Angle", "T3_Velocity", "T3_Angle", "T2_Velocity", "T2_Angle", "T4_Velocity", "T4_Angle", "T5_Velocity", "T5_Angle", "T9_Velocity", "T9_Angle", "T8_Velocity", "T8_Angle", "T7_Velocity", "T7_Angle", "T6_Velocity", "T6_Angle", "T13_Velocity", "T13_Angle", "T14_Velocity", "T14_Angle", "T15_Velocity", "T15_Angle", "T16_Velocity", "T16_Angle", "T17_Velocity", "T17_Angle", "T23_Velocity", "T23_Angle", "T22_Velocity", "T22_Angle", "T21_Velocity", "T21_Angle", "T20_Velocity", "T20_Angle", "T19_Velocity", "T19_Angle", "T18_Velocity", "T18_Angle", "HL387_24035001_Velocity", "HL387_24035001_Angle"]
如果换了个风电场该信息得重新编排,按照实际风电场需求
- 使用pandas创建数组、存储文件
根据扇区和机位信息建立pandas空数组
results=pd.DataFrame([],index=indexMe,columns=columnMe)
并通过iloc进行精确定位,同时赋值
results.iloc[turbineVId,sectorId]=speed2d
results.iloc[turbineAId,sectorId]=actualAngle
最终的全部实现如下:
import numpy as np
import pandas as pd
import os
import re
import math as ma
#headDir=r"C:\Users\yezhaoliang\Desktop\work\AIWind\processWindSim\HuaiLaiTurbine"
headDir=r"C:\Users\yezhaoliang\Desktop\work\AIWind\processWindSim\HuaiLaiTurbineZhuFengxiang"
## 遍历所有csv文件
def get_files(path=headDir, rule=".csv"):
all = []
for fpathe,dirs,fs in os.walk(path): # os.walk是获取所有的目录
for f in fs:
filename = os.path.join(fpathe,f)
if filename.endswith(rule): # 判断是否是"xxx"结尾
all.append(filename)
return all
if __name__ == "__main__":
## 定义计算的扇区表
columnMe=['0','22','45','67','90','112','135','157','180','202','225','247','270','292','315','337'];
## 定义风向风速表的行信息
indexMe=["T12_Velocity", "T12_Angle", "T11_Velocity", "T11_Angle", "T10_Velocity", "T10_Angle", "T1_Velocity", "T1_Angle",
"T3_Velocity", "T3_Angle", "T2_Velocity", "T2_Angle", "T4_Velocity", "T4_Angle", "T5_Velocity", "T5_Angle",
"T9_Velocity", "T9_Angle", "T8_Velocity", "T8_Angle", "T7_Velocity", "T7_Angle", "T6_Velocity", "T6_Angle",
"T13_Velocity", "T13_Angle", "T14_Velocity", "T14_Angle", "T15_Velocity", "T15_Angle", "T16_Velocity", "T16_Angle",
"T17_Velocity", "T17_Angle", "T23_Velocity", "T23_Angle", "T22_Velocity", "T22_Angle", "T21_Velocity", "T21_Angle",
"T20_Velocity", "T20_Angle", "T19_Velocity", "T19_Angle", "T18_Velocity", "T18_Angle", "HL387_24035001_Velocity",
"HL387_24035001_Angle"]
## 创建一个空的DataFrame空结构,结构index由indexMe组成,结构的columns信息由columnMe组成
results=pd.DataFrame([],index=indexMe,columns=columnMe)
b = get_files()
altitudesName=[]
for i in b:
them=i.split("\\")
currentFilename=them[them.__len__()-1]
turbinesAndSectors=re.split(r'[.|-]',currentFilename)
## 文件名第一项为风机信息
currentTurbine=turbinesAndSectors[0]
## 文件名倒数第二项为扇区信息---拆分的时候识别sector信息
currentSector=turbinesAndSectors[turbinesAndSectors.__len__()-2]
# sheetName=them[them.__len__()-3]+them[them.__len__()-2]+them[them.__len__()-1]
## 得到SectorID index用于存储数据
sectorId=columnMe.index(currentSector);
turbineVId=indexMe.index(currentTurbine+"_Velocity")
turbineAId=indexMe.index(currentTurbine+"_Angle")
sd=pd.read_csv(i,skiprows=2)
## 去除Null行(注意空格,数字也一样处理)
## 确认了第九行信息为所需要的信息 ,也可以做个线性化操作
UCRT=sd.iloc[9,2]
VCRT=sd.iloc[9,3]
speed2d=sd.iloc[9,5]
## 有趣的是: python atan2(y,x) 而在excel对应的为 atan2(x,y) -->只是针对和x轴夹角
## 如果需要针对y轴夹角必须采用python的atan2(x,y), 或者 excel的atan2(y,x)才是扇区角度的意思
actualAngle=ma.atan2(UCRT,VCRT)*180/3.1415926+180
## 赋值
results.iloc[turbineVId,sectorId]=speed2d
results.iloc[turbineAId,sectorId]=actualAngle
results.to_csv("Results-WindSimSpeedTableZhuFengxiagn.csv",index=indexMe,columns=columnMe)
Related