日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python整理PEER所下载的地震波源数据——提取地震波至txt+生成地震波反应谱

發(fā)布時間:2024/8/1 python 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python整理PEER所下载的地震波源数据——提取地震波至txt+生成地震波反应谱 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python整理PEER所下載的地震波源數(shù)據(jù)——提取地震波至txt+生成地震波反應(yīng)譜

  • 導(dǎo)語
  • gitee代碼托管
    • 一、實現(xiàn)目標(biāo)
      • 運行效果
      • 1 已下載的文件
      • 2 實現(xiàn)的效果
    • 二、代碼過程
      • 1 需要的庫
      • 2 主要函數(shù):共5個
        • 函數(shù)1:得到‘.py’程序所在的文件目錄及下一級子目錄的路徑列表a,返回列表a
        • 函數(shù)2:將每一路徑下的‘.csv’文件轉(zhuǎn)為‘.xlsx’(‘.csv’文件存有地震波名稱,此步轉(zhuǎn)化方便將地震波名稱從‘.xlsx’中提取出來)
        • 函數(shù)3:處理地震波源數(shù)據(jù),返回地震波的dt、npst、數(shù)據(jù)列表
        • 函數(shù)4:根據(jù)所給路徑創(chuàng)建文件夾
        • 函數(shù)5:由保存有地震波的列表,計算地震波反應(yīng)譜(此處參考[Dino陳博](https://zhuanlan.zhihu.com/p/401823576)所推薦的Nigam積分法)
      • 3 實現(xiàn)思路

導(dǎo)語

在進(jìn)行動力時程分析前,選取合適的地震波是必須的。當(dāng)前最熱門的地震波下載網(wǎng)站當(dāng)屬PEER(太平洋地震工程研究中心)。從此網(wǎng)站下載地震波以后,往往需要將地震波數(shù)據(jù)進(jìn)行二次轉(zhuǎn)化,一方面得到用于導(dǎo)入其他軟件的特種格式,另一方面生成地震波的反應(yīng)譜。得到反應(yīng)譜并不難,但是如何及時得到反應(yīng)譜而略掉繁瑣的‘點、點、點~’呢?本篇文章將解決此問題。

gitee代碼托管

全部功能實現(xiàn)代碼已托管至我的gitee賬號MY,如有代碼問題,可在gitee中提交,或與我聯(lián)系。對于地震波數(shù)據(jù)整理所需的關(guān)鍵函數(shù)已全部展示于上,亦可根據(jù)提示編輯屬于自己的實現(xiàn)程序。
創(chuàng)作不易,歡迎關(guān)注、點贊、轉(zhuǎn)發(fā)、支持,謝謝!

一、實現(xiàn)目標(biāo)

本篇文章的前提是處理從PEER上下載的地震波,目標(biāo)是將所下載的地震波的地震波數(shù)據(jù)(存于txt中)、dt(時間步長)、ntps(時間步)、加速度反應(yīng)譜四類信息進(jìn)行處理。得到的結(jié)果,將地震波數(shù)據(jù)按不同時間步長整理的文件夾;含有地震波名稱、dt、npts、加速度譜信息的表格。

運行效果

1 已下載的文件


為了展示,此處只下載了兩條地震波,并在此目錄文件內(nèi)及下一級子目錄文件內(nèi)將地震波進(jìn)行解壓。可以看到,在這種狀態(tài)下,當(dāng)每級目錄下的地震波若有100條時,或者,一條一條下載所得的地震波,處理起來的工程量不小。雖然能處理地震波的軟件不少,但是地震波導(dǎo)入以后再依次復(fù)制出目標(biāo)信息的方式非常的繁瑣。

2 實現(xiàn)的效果

運行后,會將處理后的信息進(jìn)行匯總于“處理后輸出匯總”文件夾內(nèi)。

“處理后輸出匯總”文件夾,是根據(jù)地震波所在的目錄,將地震波按目錄重新創(chuàng)建文件夾,并將其按時間步長類型進(jìn)行整理。“地震波信息匯總.xlsx”表格保存有每級目錄下的地震波的名稱、dt、npts、加速度譜。

二、代碼過程

1 需要的庫

import os import glob import openpyxl from pyexcel.cookbook import merge_all_to_a_book as sss import math

2 主要函數(shù):共5個

函數(shù)1:得到‘.py’程序所在的文件目錄及下一級子目錄的路徑列表a,返回列表a

def file_name(file_dir): # 將目標(biāo)路徑和它下一級的子目錄文件夾路徑全部輸出至列表a1 = 1a = []for root, dirs, files in os.walk(file_dir):if a1 == 1:b = dirsa.append(file_dir)for i in range(0,len(b)):h = file_dir + '\\' + b[i]a.append(h)breakreturn a

函數(shù)2:將每一路徑下的‘.csv’文件轉(zhuǎn)為‘.xlsx’(‘.csv’文件存有地震波名稱,此步轉(zhuǎn)化方便將地震波名稱從‘.xlsx’中提取出來)

def csv_to_xlsx(path_1): # path_1為列表h1 = file_name(path_1)bb1 = 1print('共有' + str(len(h1)) + '個含有' + '.scv' + '文件夾目錄')for i in range(0,len(h1)):print('現(xiàn)在處理第' + str(bb1) + '個文件夾內(nèi)的所有'+ ''''.csv'文件!''')b1 = h1[i] + '\\' '*.csv'b2 = glob.glob(b1) # 獲取bb文件夾內(nèi)的所有‘.csv’文件的路徑print(b2)b3 = []if b2 == []:continueelse:for j in range(0,len(b2)):b3.append(b2[j])sss(b3, h1[i] + '\\' + b2[j].split('\\')[-1].replace('.csv','.xlsx'))b3 = []bb1 += 1print('’.scv‘文件處理完畢')

函數(shù)3:處理地震波源數(shù)據(jù),返回地震波的dt、npst、數(shù)據(jù)列表

def Ssw(inFilename):dt = 0.0npts = 0a = []inFileID = open(inFilename, 'r')flag = 0for line in inFileID:if line == '\n':continueelif flag == 1: # 此處用flag來進(jìn)行標(biāo)記,讀取到帶有DT的行后,后面的行都標(biāo)記為1(進(jìn)而將后面的行進(jìn)行寫出)###################################words = line.split()lengthLine = len(words)if words[0] == '***':breakelse:for i in range(0, lengthLine):a.append(float(words[i])) # 將地震波數(shù)據(jù)提取并存儲至列表a中#######################################else: # 此處為對數(shù)據(jù)進(jìn)行讀取,并標(biāo)記開始進(jìn)行數(shù)據(jù)寫入的開始行(只不過并沒有標(biāo)記處是從哪一行開始,而是以從這一行開始后面都是需要寫入的地震波數(shù)據(jù)words = line.split()lengthLine = len(words)if lengthLine >= 4:if words[0] == 'NPTS=':for word in words:if word != '':if flag == 1:dt = float(word)break # 此處的break中斷的點是單個line的判斷if flag == 2:npts = int(word.strip(','))flag = 0if word == 'DT=' or word == 'dt':flag = 1if word == 'NPTS=':flag = 2elif words[-1] == 'DT':count = 0for word in words:if word != '':if count == 0:npts = int(word)elif count == 1:dt = float(word)elif word == 'DT':flag = 1break # 此處的break中斷的點是單個line的判斷count += 1return dt, npts, a

函數(shù)4:根據(jù)所給路徑創(chuàng)建文件夾

def mkdir(path): # 此項為創(chuàng)文件import os# 去除首位空格path = path.strip() # 刪除空白符(包括'\n', '\r', '\t', ' ')path = path.rstrip("\\") # 去除尾部 \ 符號# 判斷路徑是否存在isExists = os.path.exists(path)if not isExists:# 如果不存在則創(chuàng)建目錄# 創(chuàng)建目錄操作函數(shù)os.makedirs(path)print(path + ' 創(chuàng)建成功')return Trueelse:# 如果目錄存在則不創(chuàng)建,并提示目錄已存在print(path + ' 目錄已存在')return False

函數(shù)5:由保存有地震波的列表,計算地震波反應(yīng)譜(此處參考Dino陳博所推薦的Nigam積分法)

def nigam_clac(k,m,dt,damp,nstep):tt=w=h=w2=hw=0.0hw=wd=e=a11=a12=a21=a22=ss=cc=s1=c1=s2=c2=s3=c3=0.0wdt=cwdt=swdt=b11=b12=b21=b22=x=sa=sv=sd=0.0ddx=dx=dxf=xf=ddym=ddyf=0.0nn=mm=0dis=[]vel=[]acc=[]tim=[]pi = math.pi##tt =2*pi*math.sqrt(m/k)w =2*pi/tt ##cir freqh =dampw2 =w*whw =h*wwd =w*math.sqrt(1-h*h)wdt =wd*dte =math.exp(-hw*dt)cwdt =math.cos(wdt)swdt =math.sin(wdt)##a11 =e*(cwdt+hw*swdt/wd)a12 =e*swdt/wda21 =-e*w2*swdt/wda22 =e*(cwdt-hw*swdt/wd)ss =-hw*swdt-wd*cwdtcc =-hw*cwdt+wd*swdts1 =(e*ss+wd)/w2c1 =(e*cc+hw)/w2s2 =(e*dt*ss+hw*s1+wd*c1)/w2c2 =(e*dt*cc+hw*c1-wd*s1)/w2s3 =dt*s1-s2c3 =dt*c1-c2b11 =-s2/wdtb12 =-s3/wdtb21 =(hw*s2-wd*c2)/wdtb22 =(hw*s3-wd*c3)/wdt##acc.append(2*hw*gm[0]*dt)vel.append(-1*gm[0]*dt)dis.append(0.0)tim.append(0.0)x =0.0sa =0.0sv =0.0sd =0.0nn =nstepfor mm in range(nn):tim.append(mm*dt)dxf =dxxf =xddym =gm[mm+1]ddyf =gm[mm]x = a12*dxf+a11*xf+b12*ddym+b11*ddyfdx =a22*dxf+a21*xf+b22*ddym+b21*ddyfddx =-2*hw*dx-w2*xacc.append(ddx)vel.append(dx)dis.append(x)sa =max(sa,abs(ddx))sv =max(sv,abs(dx))sd =max(sd,abs(x))##alpha =sa/9800.0kdisp =sd##return tim,dis,vel,accreturn alpha,kdisp

3 實現(xiàn)思路

1 從‘.py’文件所在目錄,得到當(dāng)前目錄及下一級子目錄的路徑列表a1
2 遍歷路徑列表a1,并將其下的‘.csv’文件轉(zhuǎn)化為‘.xlsx’,并保存在當(dāng)前目錄下
3 創(chuàng)建輸出目錄并得到其路徑,遍歷路徑列表a1,先將先前生成的‘.xlsx’文件打開并得到指定方向的地震波名稱列表a2,根據(jù)地震波名稱列表a2,逐個處理地震波源數(shù)據(jù)文件,并將所得信息進(jìn)行輸出至所創(chuàng)建的輸出目錄中。
4 完成地震波文件的處理

總結(jié)

以上是生活随笔為你收集整理的Python整理PEER所下载的地震波源数据——提取地震波至txt+生成地震波反应谱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。