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

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
```

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

```Python
import numpy as np
data = np.loadtxt('filename.csv', comments='year', delimiter=',', dtype='float')
```
## **解説**

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

## **参考URL**
- http://d.hatena.ne.jp/y_n_c/20091117/1258423212
- http://kaiseki-web.lhd.nifs.ac.jp/documents/Python/textfile.htm
- http://seesaawiki.jp/met-python/d/%A5%D5%A5%A1%A5%A4%A5%EBI/O

# **NetCDFファイルの読み込み**
```Python
import netCDF4
nc = netCDF4.Dataset('filename.nc', 'r')
data = nc.variables['varname'][:]
```
## **解説** 

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

## **参考URL**
- http://qiita.com/okadate/items/954574a95545b06ca257
- http://seesaawiki.jp/met-python/d/%A5%D5%A5%A1%A5%A4%A5%EBI/O

# **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形式と呼ばれるもの)の中身を読み込んでみる。

```Python
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)])
```

## **解説** 

- 最終行は、

  ```python
data = []
for j in range(M):
    data.append(chunk[j]['data'])
    
data = np.array(data)
  ```
　 を1行で書き換えたものである。

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

  ```Python
   data = chunk[5]['data']
  ```
　 に置き換えれば良い。


## **参考URL**
- http://ig.hateblo.jp/entry/2014/05/30/225607
- http://seesaawiki.jp/met-python/d/%A5%D5%A5%A1%A5%A4%A5%EBI/O