前回出した課題の答えです。
こちらからお手本スクリプトを入手してください(右クリックから「名前を付けて保存」で入手)。
以下、内容の説明です。
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