LoginSignup
34
36

More than 5 years have passed since last update.

pythonで数値データを読み込む方法まとめ[CSV,NetCDF,Fortranバイナリ]

Last updated at Posted at 2016-01-18

pythonは、数値データの分析を行うのに非常に便利な言語であるが、データの分析を行うまず第一歩として、データを読み込まなければならない。
そこで、様々な形式の数値データをnumpy配列の形式で読み込む方法をまとめる。

以下、全ての場合においてファイルの中身を'data'の中に格納する。

csv(テキスト)ファイルの読み込み

filename.csv
 year,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2001,-0.4,-0.3,-0.2,-0.1,0,0,-0.1,-0.2,-0.3,-0.4,-0.5,-0.4
2002,-0.3,-0.1,0,0.3,0.4,0.5,0.6,0.7,0.8,1,1,1
2003,0.8,0.5,0,-0.2,-0.2,-0.2,-0.1,0.1,0.3,0.4,0.4,0.4
2004,0.4,0.3,0.1,0,-0.1,0,0,0.2,0.3,0.4,0.4,0.3
2005,0.2,0.1,0.1,0.1,0.2,0.3,0.2,0.1,-0.2,-0.5,-0.7,-0.8
2006,-0.8,-0.7,-0.5,-0.3,-0.2,0.1,0.3,0.4,0.6,0.8,0.9,0.8
2007,0.5,0.2,-0.2,-0.5,-0.6,-0.7,-0.9,-1.1,-1.3,-1.4,-1.5,-1.5
2008,-1.4,-1.1,-0.8,-0.5,-0.1,0.1,0.2,0.2,0.2,0,-0.2,-0.4
2009,-0.5,-0.5,-0.3,0,0.3,0.5,0.7,0.8,0.9,1,1,1.1
2010,1.1,0.9,0.7,0.3,0,-0.4,-0.8,-1.1,-1.3,-1.4,-1.5,-1.4
2011,-1.2,-0.9,-0.7,-0.4,-0.2,-0.2,-0.2,-0.4,-0.6,-0.8,-0.8,-0.7
2012,-0.6,-0.3,-0.1,0.1,0.3,0.4,0.5,0.5,0.4,0.2,0,-0.2
2013,-0.2,-0.3,-0.4,-0.4,-0.5,-0.6,-0.6,-0.5,-0.3,-0.2,-0.1,-0.2
2014,-0.2,-0.1,0,0.2,0.4,0.5,0.5,0.5,0.6,0.7,0.7,0.6
2015,0.5,0.5,0.6,0.8,1.2,99.9,99.9,99.9,99.9,99.9,99.9,99.9

メモ帳で開いた時に以上のように表示されるテキストデータを読み込む。

import numpy as np
data = np.loadtxt('filename.csv', comments='year', delimiter=',', dtype='float')

解説

  • commentsで、読み飛ばす行の左端に存在する文字列を指定する。
  • delimiterで、区切り文字を指定する。もしスペースで区切ってあった場合には、delimiter=...という記述は必要ない。
  • dtypeで、データをどの形式で読み込むかを指定する。デフォルトはfloat(浮動小数点数)。整数として読み込みたい場合にはintとすればよい。

参考URL

NetCDFファイルの読み込み

import netCDF4
nc = netCDF4.Dataset('filename.nc', 'r')
data = nc.variables['varname'][:]

解説

  • import numpyをしなくても、numpyの配列として読み込んでくれる。
  • varnameの部分には、当該変数名を入力する。
  • 読み込むデータが何次元の配列であっても、3行目の最後の部分は[:]で構わない。

参考URL

Fortranバイナリファイルの読み込み

write_binary_2D.f90
program main

  implicit none

  integer,parameter::N=10,M=20
  integer::i,j
  real,dimension(1:N,1:M)::x

  open(10,file='filename.out',form='unformatted',access='direct',recl=N*4)

  do i = 1,N
     do j = 1,M
        x(i,j) = i+j*2
     end do
  end do

  do j = 1,M
     write(10,rec=j)(x(i,j),i=1,N)
  end do

  close(10)

end program main

以上のプログラムで作成したfilename.out(リトルエンディアンのヘッダなし4バイト浮動小数点バイナリ。俗に言うGrADS形式と呼ばれるもの)の中身を読み込んでみる。

import numpy as np
N = 10  # 1レコード番号あたりに格納されているデータの数。
M = 20  # レコードの総数。
f = open('filename.out', 'r')
dty = np.dtype([('data', '<' + str(N) + 'f')])
chunk = np.fromfile(f, dtype=dty, count=M)
data = np.array([chunk[j]['data'] for j in range(M)])

解説

  • 最終行は、
data = []
for j in range(M):
    data.append(chunk[j]['data'])

data = np.array(data)

  を1行で書き換えたものである。

  • chunk[k-1]が、fortranで言うところのレコード番号kのデータに対応している。なので、例えばレコード番号6のデータだけを取り出したい場合には、最終行を
   data = chunk[5]['data']

  に置き換えれば良い。

参考URL

34
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
36