私はこのテキストファイルを持っています:www2.geog.ucl.ac.uk/~plewis/geogg122/python/delnorte.dat
3列目と4列目を抽出したい。
np.loadtxtを使用しています-エラーが発生します:
ValueError: invalid literal for float(): 2000-01-01
2005年にのみ興味があります。両方の列を抽出するにはどうすればよいですか?
私はこのテキストファイルを持っています:www2.geog.ucl.ac.uk/~plewis/geogg122/python/delnorte.dat
3列目と4列目を抽出したい。
np.loadtxtを使用しています-エラーが発生します:
ValueError: invalid literal for float(): 2000-01-01
2005年にのみ興味があります。両方の列を抽出するにはどうすればよいですか?
特定の列のカスタム変換関数をに提供できます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.]])
その年をフィルタリングするには、numpyで論理インデックス2005
を使用できます。
data_2005 = data[data[:,0] == 2005]
array([[ 2005., 210.],
[ 2005., 190.],
[ 2005., 190.],
[ 2005., 200.],
....])
csvモジュールの使用に同意します。私はこの答えを採用しました: あなたの質問に適用するためにPythonでscipy/numpyのcsvファイルを読んでください。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] )
これらの値を読み取るためにNumPy.loadtxtを使用するのではなく、csv
モジュールを使用してファイルをロードし、そのデータを読み取る必要があります。