Pandasでログ統計処理スクリプト(その2)
pandasを使うとたった一行でCSV形式のログファイルをデータフレームに収めることができます。データフレームは行と列のインデックスで管理するExcelファイルのようなものです。まずはQSO数を確かめてみましょう。これはデータフレームの行数を調べれば良いので、
In [3]: len(log) Out[3]: 500
などとします。他にもやり方がありますので調べてみてください。
さて、HAMLOG形式の文字列を取り込んでいるので不都合なことがあります。それは時刻です。'datetime'と'time'という列インデックスにとりあえず日付と時刻を当てはめてみましたが、このままでは文字列データに過ぎないので、大小の比較などができません。またJSTとUTCが混在している場合もあります。そこで、以下のようなスクリプトでUTCへ変換しかつdatetime形式にして'datetime'列に上書きしてしまいましょう。
date_list = log.datetime time_list = log.time datetime_list = [] for i, s in enumerate(date_list): date_str = s + '-' + time_list[i] logdate = datetime.strptime(date_str.rstrip('JZU'), '%y/%m/%d-%H:%M') if time_list[i].find('J') == 5: logdate = logdate - timedelta(hours = 9) datetime_list.append(logdate) log.datetime = datetime_list del log['time']; del log['jcc']; del log['gl']; del log['qsl'] del log['name']; del log['qth']; del log['rem3']
元のスクリプトlogstat.pyの後ろに上記スクリプトを書き加えてもう一度ipythonでrunさせます。log.head()でログデータの一部を見てみると、datetime列が若干変わっているはずです。GLやQTHなどの列もこの場合不要なのでdelコマンドで削除してしまいました。
In [5]: log.head() Out[5]: call datetime urrst myrst freq mode urnr mynr 0 HS7AT 2012-05-26 04:04:00 599 599 21.0 CW 1 137 1 R9UT 2012-05-26 04:13:00 599 599 21.0 CW 2 96 2 E21EIC 2012-05-26 04:14:00 599 599 21.0 CW 3 236 3 NH2T 2012-05-26 04:15:00 599 599 21.0 CW 4 559 4 PT5T 2012-05-26 04:16:00 599 599 21.0 CW 5 471
datetime列がpythonで時刻として扱える型になっています。確認したい場合は、列だけをリスト表示させます。長いのでやはり先頭の5つだけ表示させたいので、.head()をつけます。
In [7]: log.datetime.head() Out[7]: 0 2012-05-26 04:04:00 1 2012-05-26 04:13:00 2 2012-05-26 04:14:00 3 2012-05-26 04:15:00 4 2012-05-26 04:16:00 Name: datetime, dtype: datetime64[ns]
のようにリストの要素データの型がdatetime64となっているのを確認できます。
次に、コールサインからエリアを判別する関数call_area()を作っておいて(後述)、ログにあるコールを一つ一つその関数を呼び出してエリアの文字列をリストを作って、データフレームに'area'という列を新しく作って、加えるということをします。
callarea_list = [] for c in log.call: callarea_list.append(call_area(c)) log['area'] = callarea_list
In [11]: log.tail(30).head() Out[11]: call datetime urrst myrst freq mode urnr mynr area 470 P40H 2012-05-27 09:33:00 599 599 14.0 CW 473 1742 DX 471 JA2VHO 2012-05-27 11:19:00 599 599 7.0 CW 474 706 JA2 472 K7RF 2012-05-27 11:20:00 599 599 7.0 CW 475 849 DX 473 N6WIN 2012-05-27 11:23:00 599 591 7.0 CW 476 440 DX 474 KT5J 2012-05-27 11:27:00 599 599 7.0 CW 477 1353 DX
のように、area列に日本のコールにはエリア、日本以外のコールにはDXと識別されたデータを付与しておきます。以上で、データの加工は終わりました。次からログデータの統計処理です。
・・・つづく・・・