Thursday, 14 November 2024

氷河合宿その4f:ERA5 hourlyデータ連続ダウンロード(他、ダウンロード用スクリプト)

前回出した課題の答えです。

こちらからお手本スクリプトを入手してください(右クリックから「名前を付けて保存」で入手)。

以下、内容の説明です。

for iy in range(2012,2014,1):

の中に、

for im in range(1,13,1):

として、月ループを用意します。12ヶ月ある場合、13まで指定しないといけないのはpythonのお作法。これ以降、最後までインデントをもう一つ下げる必要があります。

で、次の行がポイントで、

mn = format(im,'02')

ここで、数字が入っている im を、文字列の mn とし、かつ、二桁指定で不足する場合はゼロをつけています。

「python ゼロ埋め」

で検索すると、やり方はいろいろあるようで、

mn = str(im).zfill(2)

mn = str(im).rjust(2, '0')

mn = f'{im:02}' # mn = f'{im:02d}' もあり

mn = '{0:02}'.format(im)

mn = '%02d' % im  # 古いやり方のようで推奨されてないみたい

でも、同様の処理ができるようです。Pythonのバージョンによっては動かないのもあるらしい。

試しに im = 2 に続けて上のやり方をそれぞれ試し、im リターン、mn リターンとして中身を表示してみましょう。

imが
2

mnが
'02'

と表示されれば、mnが二桁表記の文字列であることを示しています。

さらにベタなやり方は
 
if im < 10: # 一桁かどうかを判定
    mn = '0' + str(im) # 一桁の場合、前にゼロを追加
else:
    mn = str(im) # 二桁ならそのままテキストに
 
というものです。他にも、
 
mn = str(im) # まずテキストにする
if len(mn) == 1: # len()は配列の長さをみる
    mn = '0' + mn # 一桁ならゼロ追加

というのもありました。なかなか工夫していますね。

 ただ、二桁ならまだいいですが、三桁、四桁と増えていくとこのやり方ではちょっと面倒ですね。


以降はmonthlyと似たような構造です。


"year"でyr、"month"でmnが指定され、
"day" で31日分、"time"で24時間分が指定されていることがわかりますね?


あとはファイル名のところで月を追加しているのが変更点です。

dayやtimeをループを作って書いていた猛者もいましたが、それがうまく機能するかは確証がありません。ERA5サイトで作成されるAPIスクリプトをコピーしてきて、yearとmonthのところだけを置き換える方が安全です(インデント下げるのを忘れないように)。


以下に、自由大気(pressure level)のmonthly, hourlyのデータダウンロードのスクリプトも併せて置いときますので、各自好きなように使ってください。氷河合宿に関係のない人もご自由に

pressure levelのhourlyデータはの高さ方向については、自分が必要なサイトの標高のおおよその気圧がわかっている人は、-150hPaくらいまでを入手しておけばよいです。提供スクリプトの場合23層あるので、できるだけ狭い範囲を指定することをお勧めします。スンゲー時間かかる。

なお、monthlyとhourlyで範囲やlevel数をそろえておく必要はありません。srfとplの範囲もバラバラで大丈夫(ターゲットのサイトが含まれている必要はある)。

get_srf5mon.py # 地表面monthlyデータ

get_srf5hour.py # 地表面hourlyデータ

get_pl5mon.py # 自由大気monthlyデータ(気温とジオポテンシャル高度)

get_pl5hour.py # 自由大気hourlyデータ(気温とジオポテンシャル高度)

get_srf5geopotential.py # 地表面ジオポテンシャル高度

No comments:

Post a Comment