使用np.loadtxt Python从.dat中提取列

时间:2012-12-31 12:53:01

标签: python text-files

我有这个文本文件:www2.geog.ucl.ac.uk/~plewis/geogg122/python/delnorte.dat

我想提取第3列和第4列。

我正在使用np.loadtxt - 收到错误:

ValueError: invalid literal for float(): 2000-01-01

我只对2005年感兴趣。我怎样才能提取两列?

3 个答案:

答案 0 :(得分:1)

您可以为特定列提供loadtxt的自定义转化功能 由于您只对这一年感兴趣,因此我使用lambda - 函数在-上拆分日期并将第一部分转换为int

data = np.loadtxt('delnorte.dat',
         usecols=(2,3),
         converters={2: lambda s: int(s.split('-')[0])},
         skiprows=27)

array([[ 2000.,   190.],
       [ 2000.,   170.],
       [ 2000.,   160.],
       ..., 
       [ 2010.,   185.],
       [ 2010.,   175.],
       [ 2010.,   165.]])

要过滤年份2005,您可以在numpy中使用logical indexing

data_2005 = data[data[:,0] == 2005]

array([[ 2005.,   210.],
       [ 2005.,   190.],
       [ 2005.,   190.],
       [ 2005.,   200.],
        ....])

答案 1 :(得分:0)

您不应该使用NumPy.loadtxt来读取这些值,而应该使用csv module来加载文件并读取其数据。

答案 2 :(得分:0)

我同意使用csv模块。我改编了这个答案:reading csv files in scipy/numpy in Python 适用于您的问题。不确定您是否希望数据在numpy数组中或列表是否足够。

import numpy as np
import urllib2
import csv

txtFile = csv.reader(open("delnorte.dat.txt", "r"), delimiter='\t')

fields = 5                   
records = [] 
for row, record in enumerate(txtFile):
    if (len(record) != fields or record[0]=='#'):
        pass
        # print "Skipping malformed record or comment: {}, contains {} fields ({} expected)".format(record,len(record),fields)
    else:
        if record[2][0:4] == '2005': 
            # assuming you want columns 3 & 4 with the first column indexed as 0
            records.append([int(record[:][3]), record[:][4]] ) 

# if desired slice the list of lists to put a single column into a numpy array
npData = np.asarray([ npD[0] for npD in records] )