観測データをアーカイブするために、LinuxとPyhtoでデータ処理時間を比較してみた。
timeコマンド
timeコマンドはコマンド・プログラムを引数としてとり、引数として指定したコマンド・プログラムが実行されるのにどれだけ時間がかかった出力する
例)sleep 10
$ time sleep 10
real    0m10.002s
user    0m0.001s
sys     0m0.002s
timeが出力するreal, user, sysはそれぞれ次のような意味になる
| 項目 | 意味 | 
|---|---|
| real | プログラムの呼び出しから終了までにかかった実時間(秒) | 
| user | プログラム自体の処理時間(秒)(ユーザCPU時間) | 
| sys | プログラムを処理するために、OSが処理をした時間(秒)(システム時間) | 
sleep 10 はプログラム呼び出しから終了までに10.002秒がかかったが、sleep 10 自体の処理には全然CPUが使われていないことがわかる。
ファイルデータの書き込み・追記時間の検証
以下のShellスクリプトとPythoで比較:
Shell Scriptのほうが、半分位の時間で処理可能
——————————————-
Shell Script:
cat log01.txt > log20.txt
cat log02.txt >> log20.txt
kazuki:~/work/test$ time sh cat.sh
real    0m0.007s
user    0m0.004s
sys    0m0.000s
——————————————-
Pyhton:
f = open(‘log01.txt’)
data = f.read()
f.close()
out = open(“log20.txt”, “a”)
out.write(data)
out.close()
f = open(‘log02.txt’)
data = f.read()
f.close()…..
kazuki:~/work/test$ time python bk.py
real    0m0.027s
user    0m0.004s
sys    0m0.016s
————————————-
百葉箱観測データのやりとり例
データサイズ:3.7MB, CSV
Python 1
import sys
import urllib
import pandas as pd
import numpy as np
url = ‘http://miyasan.sakura.ne.jp/logdata/fujimi280/fujimi280.txt’
f = urllib.urlopen(url)
data = f.read()
out = open(“fujimi280.txt”, “w”)
out.write(data)
out.close()
df=pd.read_csv(“fujimi280.txt”,header=None)
data = df.tail(20000)
data.to_csv(‘fujimi.csv’)
————————————————-
kazuki:~/work/test$ time python bk1.py
real    0m3.373s
user    0m0.692s
sys    0m0.136s
————————————————
Pyhton 2
url = ‘http://miyasan.sakura.ne.jp/logdata/fujimi280/fujimi280.txt’
df=pd.read_csv(url, header=None)
data = df.tail(20000)
data.to_csv(‘fujimi.csv’)
————————————————-
kazuki:~/work/test$ time python bk1.py
real    0m3.414s
user    0m0.732s
sys    0m0.132s
—————————————————
Pythonのファイル操作でも、PandasのCSVReadでも、ほぼ同じ時間
 Programのシンプルさからすれば、Pandasを使う方がよい。
CSV ファイル出力 DataFrame.to_csv() メソッドでの注意
テキストデータを読込み、加工して、テキストファイルとしてへ書き込む際、データフォーマットがfloat64の場合、csv出力は勝手に小数点以下の0を丸める(下記データ)
よって、float_format=’%.2f’を記述して、オリジナルの観測データと同じフォーマットにする
例)
data_dir = ‘/home/kazuki/work/test/log20.txt’
df=pd.read_csv(data_dir,header=None)
#df.dtypes
#Out[73]:
#0     object
#1    float64
#2      int64
#3      int64
#4    float64
#5    float64
#6    float64
#7      int64
#dtype: object
#original data:
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.10,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.40,86.20,8
2016/09/01 00:10:30,12.84,16,600,16.00,899.40,86.51,1
#df.to_csv(‘log21.txt’,index=False, header=False)
to_csv output data :
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.1,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.4,86.2,8
2016/09/01 00:10:30,12.84,16,600,16.0,899.4,86.51,1
#df.to_csv(‘log21.txt’,index=False, header=False,float_format=’%.2f’)
to_csv output data :
2016/09/01 00:06:24,12.84,16,607,16.11,899.44,84.73,4
2016/09/01 00:07:26,12.84,16,595,16.10,899.39,84.94,14
2016/09/01 00:09:29,12.84,16,570,16.02,899.40,86.20,8
2016/09/01 00:10:30,12.84,16,600,16.00,899.40,86.51,1
diff log20.txt log21.tx –> OK!! オリジナルデータと差分なし
 
										
					
					
			