複数の CSV ファイルをつないでひとつのデータフレームにする (Python Pandas)

同じ地点で同じ気象要素の観測がつづいているのだが、データが複数のファイルにわかれていることがある。

とくに、気象庁の「 過去の気象データ・ダウンロード」では、 一度にダウンロードできる CSV ファイルの大きさに制限があるので、 たとえば、日別値で何年も、あるいは、時別値で何か月もにわたるデータをつかおうとすると、 複数回にわけてダウンロードしないといけない。

Python の Pandas の read_csv をつかえば、1つのCSVファイルを1つのデータフレームに 読みこむことができる。 それから複数のデータフレームをつないで1つのデータフレームにできればよい。 つなぐ方法として、わたしはこれまで、要素をそれぞれ追加していく方法しか知らなかったのだが、 最近しらべて、まとめて追加できることがわかった。

ここではひとまず、CSVファイルどうしで、 各列の意味 (どの列が どの地点のどの気象要素か) が 同じであるばあいをあつかう。

(気象庁からのダウンロードでは、取得操作をする人が、地点を指定する順序をかえてしまったり、 気象要素のくみあわせをかえたりすると、各列の意味がちがうCSVファイルができてしまう。 そのようなものの時系列をつなげることもくふうすればできるが、 こうすればよいと一般的に書くのがむずかしいので、ひとまずみおくる。)

操作の形をしめすために、短いデータ例をつくってみた。 熊谷の日照時間と降水量の月別値を、年ごとに別々にダウンロードして、ファイル名をそれぞれつけかえた。 (ここでは日付は年と月を別々の列にしてダウンロードした。 日付を「日付リテラル」にしたばあいも、下にのべる例の year と month の列がひとつにまとめられること以外は、同様である。)

ここからのプログラム例の実行のまえに、上の6つのファイルを作業用ディレクトリに持ってきてあるとする。

read1.py: 1つのCSVファイルを読む

1つの CSVファイルをデータフレーム df に読みこんでみる。

列名は気象庁のCSVファイルの1つの行から読みとる方法ではうまくいかないので、別途あたえた。 year:年, month:月, sundur;日照時間, x_sundur:日照時間の現象なし情報, q_sundur:日照時間の品質情報, h_sundur:日照時間の均質番号, precip:降水量, x_precip:降水量の現象なし情報, q_precip:降水量の品質情報, h_precip:降水量の均質番号。 (英語の、日照時間 sunshine duration、降水 precipitation, 存在する exist, 品質 quality, 均質な homogeneous をもとにした。)

read2.py: 2つのCSVファイルの内容をつなぐ

2つの CSV ファイルをそれぞれ df1, df2 に読みこんだあと、 その2つをつないで df をつくる。 つなぐには、Pandas の concat という関数をつかう方法と、append というメソッドをつかう方法がある。 (英語としては concatenate は「連結する」、append は「追加する」という意味である。) プログラム例では一方をコメントにしてある。

(なお、データフレームには index といって最初の行を 0 とした通し番号がつけられているが、 単純につなぐと、もとのデータフレームの index 番号が維持されるので、 できあがったデータフレームには index 番号が同じ複数の行が生じ、わかりにくくなる。 concat でも append でも「ignore_index=True」というオプションをつけると、 index 番号はつけなおされる。)

read3.py: 多数のCSVファイルの内容をつなぐ

もっと多数の CSV ファイルをつなぎたいことがある。 そのばあいは、ファイルを読むところと、その内容をデータフレームに追加するところを、 ループでまわせばよい。 いまの例では、ファイル名に年がいれてあるので、年の整数値でループをまわし、 それを文字列に変換してファイル名をくみたてることにした。 それぞれの CSV ファイルを df1 というデータフレームに読みこんでから、 df に df1 の内容をつけたしている。 つけたすには、append をつかうこともでき、concat をつかうこともできる (一方をコメントにしてある)。

append のばあいも、concat のばあいも、代入をあらわす「=」の両辺に df が出現している。 もしプログラム言語処理系が、右辺の df をつかいおえるまえに左辺の代入をして df の値をかえてしまうと、 結果は期待どおりでなくなる (へたをするとプログラムがとまらなくなる)。 これまでためしたかぎりでは、両辺に同じ df をつかっていても結果はよさそうだ。 しかし、もしまずいならば、左辺をひとまず別の変数 (たとえば df2) にしておき、 あらためて「df = df2」で代入する形になおすのがよいだろう。

プログラム例の最後に「print(df)」がいれてあるが、read3.py のばあいは 結果の行数が多いので、実際にプリントされる内容は中間が省略されたものになる。 dfの内容が期待どおりになっているか確認するためには、もうひとくふう必要だ。


2022-04-48
増田 耕一 (MASUDA Kooiti)
[計算機を利用した気象分野の実習の教材]
立正大学用 [セミナーのページ]