找回密码
 注册
Simdroid-非首页
查看: 364|回复: 7

[土木] python处理地震波文件

[复制链接]
发表于 2011-10-14 12:13:46 | 显示全部楼层 |阅读模式 来自 天津
本帖最后由 zb580504 于 2011-10-14 17:16 编辑

自己专业方向是抗震,昨天一个同学问我要一条地震波,无奈自己以前用的地震波都是师兄给的,已经处理好了。
大家都知道一般可以在PEER上下载地震波文件。但原始文件是多行多列的,我们一般习惯用那种单列的数据。
当然可以将多行多列数据拷到Excel中,用OFFSET函数将其变成单列数据。但这样感觉还是稍微麻烦了一点。
正好最近在学python,看了很多别人编的代码,很少自己动手实践。前段时间写了个py文件读取abaqus的odb文件
的时程曲线,无奈数据点太多,可能方法不当,代码效率不是很高。
一直就比较羡慕别人用编程语言操作文本,今天算是自己头一次用python操作文本文件。对于高手来说,我写出的代码
必然会有很多的不足之处,欢迎提出问题。
PEER上下载的地震波文件一般是这样的


前四行数据是对该地震波的一些相应情况的说明,从第五行开始是地震波记录,每行5个数据,文件扩展名是AT2。

编写的代码如下:

  1. #!/user/bin/python
  2. # -*-coding:utf-8 -*-
  3. def dizhenbochuli (filenamein,filenameout,dt):
  4.   f=open(filenamein,'r')
  5.   f1=open(filenameout,'w')
  6.   lines=f.readlines()
  7.   lines=[line.split() for line in lines]
  8.   liness=lines[4:]
  9.   a=[]
  10.   j=0
  11.   delta=float(dt)
  12.   for line in liness:
  13.     for i in range(len(line)):
  14.      j=j+1
  15.      a.append(str((j-1)*delta)+','+str(line[i])+'\n')
  16.   f1.writelines(a)
  17.   f1.close()
  18.   f.close()
  19. if __name__=='__main__':
  20.   filenamein=raw_input('input filename:')
  21.   filenameout=raw_input('output filename:')
  22.   dt=raw_input('地震波时间间隔dt为:')
  23.   dizhenbochuli(filenamein,filenameout,dt)
复制代码
代码运行如下图所示:



这样就生成了需要的地震波文件,我将第一列设成了时间,第二列地震波记录,中间用逗号隔开:
如下所示:


附上PY文件!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2011-10-20 21:02:52 | 显示全部楼层 来自 天津
Simdroid开发平台
近日闲来无聊,正好最近正在学OpenSees ,发现OpenSees中的地震波文件是那种一行五个数据点的,于是把前面的代码稍微改了下:




  1. #!/user/bin/python
  2. # -*-coding:utf-8 -*-
  3. #该函数将一般一行5个数据点的地震波文件转化成第一列时间,第二列数据点,中间逗号隔开的文件!
  4. def dizhenbochuli (filenamein,filenameout,dt):
  5. f=open(filenamein,'r')
  6. f1=open(filenameout,'w')
  7. lines=f.readlines()
  8. lines=[line.split() for line in lines]
  9. #liness=lines[4:]
  10. a=[]
  11. j=0
  12. delta=float(dt)
  13. for line in lines:
  14.   for i in range(len(line)):
  15.    j=j+1
  16.    a.append(str((j-1)*delta)+','+str(line[i])+'\n')
  17. f1.writelines(a)
  18. f1.close()
  19. f.close()
  20. #该函数将上面得到的地震波文件反过来转化成一行5个数据点的地震波文件!
  21. def OpenSeesdizhenbo (filenamein,filenameout):
  22. f=open(filenamein,'r')
  23. f1=open(filenameout,'w')
  24. lines=f.readlines()
  25. lines=[line.split(',') for line in lines]
  26. a=[]
  27. m=len(lines)
  28. j=0
  29. for i in range(m):
  30.   for line in lines[5*i:5*i+5]:
  31.    a.append(str(line[1]))
  32. for line in lines[5*i+5:]:
  33.   a.append(str(line[1]))
  34. b=[]
  35. for n in range(len(a)):
  36.   if n%5!=4:
  37.    b.append(a[n].replace('\n','')+' ')
  38.   else:
  39.    b.append(a[n])
  40. f1.writelines(b)
  41. f1.close()
  42. f.close()
  43. if __name__=='__main__':
  44. filenamein=raw_input('input filename:')
  45. filenameout=raw_input('output filename:')
  46. dt=raw_input('地震波时间间隔dt为:')
  47. dizhenbochuli(filenamein,filenameout,dt)
复制代码

  1. #通过以下调用便可:(该文件存成dizhenbochuli.py)
  2. from dizhenbochuli import *
  3. dizhenbochuli(*,*,*)#转成时间间隔-数据点形式,中间逗号隔开.
  4. OpenSeesdizhenbo(*,*)#转成一行5个数据点形式
复制代码

回复 不支持

使用道具 举报

发表于 2011-10-20 23:29:18 | 显示全部楼层 来自 华南理工大学
不错,但是对于编程不熟练的童鞋,其实还有一种更简便的方法。直接在Excel里面导入Txt文件,稍加修改即可变成只有两列的数据。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-10-21 00:25:53 | 显示全部楼层 来自 天津
pbscut 发表于 2011-10-20 23:29
不错,但是对于编程不熟练的童鞋,其实还有一种更简便的方法。直接在Excel里面导入Txt文件,稍加修改即可变 ...

呃,这个我知道,而且我这里也有一个excel做的,但考虑到那样还得倒来倒去比较麻烦,就编了个这个来简化一下,而且最主要是联系下python,最近正在学这个。
回复 不支持

使用道具 举报

发表于 2014-1-16 18:44:56 | 显示全部楼层 来自 重庆
学习一下,非常有用
回复 不支持

使用道具 举报

发表于 2019-7-21 17:34:11 | 显示全部楼层 来自 河南三门峡
学习一下,非常有用
回复 不支持

使用道具 举报

发表于 2019-9-25 15:21:19 | 显示全部楼层 来自 福建福州
谢谢楼主无私提供程序~在此表示感谢~
回复 不支持

使用道具 举报

发表于 2019-12-12 19:38:12 | 显示全部楼层 来自 辽宁沈阳
很有用的分享
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-2 08:43 , Processed in 0.033578 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表