気象庁で世界の年平均気温偏差(℃)が公開されている。毎年最新のデータに更新され,結果は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-')
でよい(cp932
は sjis
でもよい)。いつも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: