JF1DIR業務日誌(はてなblog版)

アマチュア無線局JF1DIRのアクティビティをつづっています。

Pandasでログ統計処理スクリプト(その2)

pandasを使うとたった一行でCSV形式のログファイルをデータフレームに収めることができます。データフレームは行と列のインデックスで管理するExcelファイルのようなものです。まずはQSO数を確かめてみましょう。これはデータフレームの行数を調べれば良いので、

In [3]: len(log)
Out[3]: 500

などとします。他にもやり方がありますので調べてみてください。
さて、HAMLOG形式の文字列を取り込んでいるので不都合なことがあります。それは時刻です。'datetime'と'time'という列インデックスにとりあえず日付と時刻を当てはめてみましたが、このままでは文字列データに過ぎないので、大小の比較などができません。またJSTUTCが混在している場合もあります。そこで、以下のようなスクリプト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と識別されたデータを付与しておきます。以上で、データの加工は終わりました。次からログデータの統計処理です。

・・・つづく・・・