从一个母列表中创建单独的新列表

时间:2017-08-05 17:55:55

标签: python list csv

我正在尝试编写一个阅读地震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方式来分割日期。 感谢您花时间阅读它。 最好的祝福。 托尼诺

3 个答案:

答案 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'

编辑2017/8/6 12h55

恕我直言,将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])