我正在尝试编写一个阅读地震USGS公告的脚本并获取一些数据来构建一个新的txt文件,以便为其他程序提供输入,称为Zmap进行地震统计 所以我有以下USGS公告格式:
time,latitude,longitude,depth,mag,magType,nst,gap,dmin,rms,net,id,updated,place,type,horizontalError,depthError,magError,magNst,status,locationSource,magSource
2016-03-31T07:53:28.830Z,-22.6577,-68.5345,95.74,4.8,mww,,33,0.35,0.97,us,us20005dm3,2016-05-07T05:09:39.040Z,"43km NW of San Pedro de Atacama, Chile",earthquake,6.5,4.3,,,reviewed,us,us
2016-03-31T07:17:19.300Z,-18.779,-67.3104,242.42,4.5,mb,,65,1.987,0.85,us,us20005dlx,2016-04-24T07:21:05.358Z,"55km WSW of Totoral, Bolivia",earthquake,10.2,12.6,0.204,7,reviewed,us,us
这有很多地震事件,所以我做了以下代码,基本上尝试读取,拆分和保存列表中的一些变量,将它们放在最终的* txt文件中。
import os, sys
import csv
import string
from itertools import (takewhile,repeat)
os.chdir('D:\\Seismic_Inves\\b-value_osc\\try_tonino')
archi=raw_input('NOMBRE DEL BOLETIN---> ')
ff=open(archi,'rb')
bufgen=takewhile(lambda x: x, (ff.read(1024*1024) for _ in repeat(None)))
numdelins= sum(buf.count(b'\n') for buf in bufgen if buf) - 1
with open(archi,'rb') as f:
next(f)
tiempo=[]
lat=[]
lon=[]
prof=[]
mag=[]
t_mag=[]
leo=csv.reader(f,delimiter=',')
for line in leo:
tiempo.append(line[0])
lat.append(line[1])
lon.append(line[2])
prof.append(line[3])
mag.append(line[4])
t_mag.append(line[5])
tiempo=[s.replace('T', ' ') for s in tiempo] #remplaza el tema de la T por espacio
tiempo=[s.replace('Z','') for s in tiempo] #quito la Z
tiempo=[s.replace(':',' ') for s in tiempo] # quito los :
tiempo=[s.replace('-',' ') for s in tiempo] # quito los -
从USGS目录中我想采取:纬度(纬度),经度(lon),时间(tiempo),深度(prof),幅度(mag),幅度类型(t_mag),这部分代码我拿了我需要的变量:
next(f)
tiempo=[]
lat=[]
lon=[]
prof=[]
mag=[]
t_mag=[]
leo=csv.reader(f,delimiter=',')
for line in leo:
tiempo.append(line[0])
lat.append(line[1])
lon.append(line[2])
prof.append(line[3])
mag.append(line[4])
t_mag.append(line[5])
但是我遇到了一些麻烦,所以我运用我的新手知识将时间从2016-03-31T07:53:28.830Z
分成2016 03 31 07 53 28.830
。
现在我正在努力尝试在一个列表中将年份([2016,2016,2016,...]
)放在其他列表中([01,01,...03,03,...12]
),在其他日期([12,14,...03,11
]),在其他时间([13,22,14,17...
]),以及由点(。)合并的分钟,如([minute.seconds]
)或([12.234,14.443,...]
),所以我试图这样做(以便占用空格) )并没有成功
tiempo2=[]
for element in tiempo:
tiempo2.append(element.split(' '))
print tiempo2
没有成功,因为我得到了这个结果:
[['2016', '03', '31', '07', '53', '28.830'], ['2016', '03', '31', '07', '17', '19.300'].
你可以帮我解决这个问题吗?或者是否像我之前所说的那样有一个pythonic方式来分割日期。 感谢您花时间阅读它。 最好的祝福。 托尼诺
答案 0 :(得分:0)
假设我们的tiempo2拥有从csv中提取的以下值:
>>> tiempo2 = [['2016', '03', '31', '07', '53', '28.830'], ['2016', '03', '31', '07', '17', '19.300']]
>>> list (map (list, (map (float, items) if index == 5 else map (int, items) for index, items in enumerate (zip (*tiempo2)))))
[[2016, 2016], [3, 3], [31, 31], [7, 7], [53, 17], [28.83, 19.3]]
这里我们使用zip功能来压缩年,月,日等...
如果列表的索引不是浮点数的最后一个,我将每个项的条件映射应用于int
答案 1 :(得分:0)
我建议使用time.strptime()
函数将时间字符串解析为time.struct_time
的Python namedtuple
。这意味着您可以使用.
表示法访问所需的任何属性。
这就是我的意思:
import time
time_string = '2016-03-31T07:53:28.830Z'
timestamp = time.strptime(time_string, '%Y-%m-%dT%H:%M:%S.%fZ')
print(type(timestamp))
print(timestamp.tm_year) # -> 2016
print(timestamp.tm_mon) # -> 3
print(timestamp.tm_mday) # -> 31
print(timestamp.tm_hour) # -> 7
print(timestamp.tm_min) # -> 53
print(timestamp.tm_sec) # -> 28
print(timestamp.tm_wday) # -> 3
print(timestamp.tm_yday) # -> 91
print(timestamp.tm_isdst) # -> -1
您可以使用list
循环处理for
个时间字符串,如下所示:
import time
tiempo = ['2016-03-31T07:53:28.830Z', '2016-03-31T07:17:19.300Z']
for time_string in tiempo:
timestamp = time.strptime(time_string, '%Y-%m-%dT%H:%M:%S.%fZ')
print('year: {}, mon: {}, day: {}, hour: {}, min: {}, sec: {}'.format(
timestamp.tm_year, timestamp.tm_mon, timestamp.tm_mday,
timestamp.tm_hour, timestamp.tm_min, timestamp.tm_sec))
输出:
year: 2016, mon: 3, day: 31, hour: 7, min: 53, sec: 28
year: 2016, mon: 3, day: 31, hour: 7, min: 17, sec: 19
答案 2 :(得分:0)
使用iso8601附加组件的另一种解决方案(pip install iso8601
)
>>> import iso8601
>>> dt = iso8601.parse_date('2016-03-31T07:17:19.300Z')
>>> dt.year
2016
>>> dt.month
3
>>> dt.day
31
>>> dt.hour
7
>>> dt.minute
17
>>> dt.second
10
>>> dt.microsecond
300000
>>> dt.tzname()
'UTC'
恕我直言,将datetime
时间戳对象拆分为各个列表中的组件(年,月,...)是个坏主意。保持datetime
提供的iso8601.parse_date(...)
时间戳对象有助于计算事件之间的时间增量,检查时间顺序,...查看datetime
模块的文档了解更多{{3 }}
拥有年,月,(...)的不同列表会使此类操作变得困难。无论如何,如果你更喜欢这个解决方案,这里有更改
import iso8601
# Start as former solution
with open(archi,'rb') as f:
next(f)
# tiempo=[]
dt_years = []
dt_months = []
dt_days = []
dt_hours = []
dt_minutes = []
dt_timezones = []
lat=[]
lon=[]
prof=[]
mag=[]
t_mag=[]
leo=csv.reader(f,delimiter=',')
for line in leo:
# tiempo.append(line[0])
dt = iso8601.parse_date(line[0])
dt_years.append(dt.year)
dt_months.append(dt.month)
dt_days.append(dt.day)
dt_hours.append(dt.hour)
dec_minutes = dt.minute + (dt.seconds / 60) + (dt.microsecond / 600000000)
dt_minutes.append(dec_minutes)
dt_timezones.append(dt.tzname())
lat.append(line[1])
lon.append(line[2])
prof.append(line[3])
mag.append(line[4])
t_mag.append(line[5])