気象庁の「世界の年平均気温偏差」データ

気象庁で世界の年平均気温偏差(℃)が公開されている。毎年最新のデータに更新され,結果はCSVファイル an_wld.csv でも公開されている。

このデータを読んでグラフを描くのは簡単で,

import pandas as pd
import matplotlib.pyplot as plt

URL = 'https://www.data.jma.go.jp/cpdinfo/temp/list/csv/an_wld.csv'
df = pd.read_csv(URL, encoding='cp932')
plt.plot(df['年'], df['世界全体'], 'o-')

でよい(cp932sjis でもよい)。いつもPythonの演習に使っている(気象庁の「世界の年平均気温偏差」データの回帰分析など参照)。

ところが,あるとき上のコードが働かなくなった。調べてみると,2020-12-22に更新されたCSVファイルが

年,世界全体,北半球,南半球
1891,-0.63,-0.68,-0.59
1892,-0.71,-0.80,-0.62
(中略)
2019,+0.43,+0.57,+0.30
2020,+0.47*,+0.70*,+0.25*

のように,2020年のデータに余計な * が付いているため,数値と解釈できなくなってしまっている。世界の年平均気温偏差(℃)によれば * は「1月から11月までの月平均気温の偏差をもとに算出した速報値」だそうである(余計なことを💢)。対処法は

df = pd.read_csv('URL, encoding='cp932', skipfooter=1)

として最後の行を読まないようにするのが一番簡単である。あるいは,全部読んでから

df = df.replace(r'\*', '', regex=True).astype(float)

のようにして * を削除して数値に変換する。さらに別の方法として

def foo(x):
    return float(x.replace('*', ''))

df = pd.read_csv(URL, encoding='cp932', converters={1:foo, 2:foo, 3:foo})

のようにコンバータを使う手もある。

Polars を使えば ignore_errors=True オプションで * 付きの数値は欠測値扱いになる。

なお,上記の余分な * はタイムスタンプ 2021-02-01 のCSVファイルでは消えた。2020年の数値も改訂されている:

2020,+0.45,+0.67,+0.23

2021-12-22 の an_wld.csv でまた * が付いた:

2021,+0.22*,+0.34*,+0.08*

2022-02-01 で * が取れた:

2021,+0.22,+0.35,+0.09

Last modified: