2

次のような成長し続けるcsvファイルがあります。

143100, 2012-05-21 09:52:54.165852
125820, 2012-05-21 09:53:54.666780
109260, 2012-05-21 09:54:55.144712
116340, 2012-05-21 09:55:55.642197
125640, 2012-05-21 09:56:56.094999
122820, 2012-05-21 09:57:56.546567
124770, 2012-05-21 09:58:57.046050
103830, 2012-05-21 09:59:57.497299
114120, 2012-05-21 10:00:58.000978
-31549410, 2012-05-21 10:01:58.063470
90390, 2012-05-21 10:02:58.108794
81690, 2012-05-21 10:03:58.161329
80940, 2012-05-21 10:04:58.227664
102180, 2012-05-21 10:05:58.289882
99750, 2012-05-21 10:06:58.322063
87000, 2012-05-21 10:07:58.391256
92160, 2012-05-21 10:08:58.442438
80130, 2012-05-21 10:09:58.506494

負の数は、ファイルを生成するサービスでAPI接続に障害が発生した場合に発生します。私はすでにmatplotlibを使用してデータをグラフ化していますが、人為的な負の数はグラフを大きく台無しにします。すべての否定的なエントリを見つけて、対応する行を削除したいと思います。実際のデータを実際に表す負の数はありません。

Bashでは次のようなことをします:

awk '{print $1}' original.csv | sed '/-/d' > new.csv

しかし、それは面倒で遅くなる傾向があり、私がそれを助けることができれば、Pythonグラフ作成スクリプトにbashコマンドを埋め込みたくありません。

誰かが私を正しい方向に向けることができますか?

編集:

データの読み取り/プロットに使用しているコードは次のとおりです。

import matplotlib
matplotlib.use('Agg')                                          
from matplotlib.mlab import csv2rec                           
import matplotlib.pyplot as plt                               
import matplotlib.dates as mdates                              
from pylab import *                                         

output_image_name='tpm.png'                   

data = csv2rec('counter.log', names=['packets', 'time'])   
rcParams['figure.figsize'] = 10, 5                              
rcParams['font.size'] = 8                                       

fig = plt.figure()                                              

plt.plot(data['packets'], data['time'])                      

ax = fig.add_subplot(111)                                       
ax.plot(data['time'], data['tweets'])                         
hours = mdates.HourLocator()                                    
fmt = mdates.DateFormatter('%D - %H:%M')                       
ax.xaxis.set_major_locator(hours)                               
ax.xaxis.set_major_formatter(fmt)                               

ax.grid()                                                

plt.ylabel("packets")                                         
plt.title("Packet Log: Packets Per Minute")         

fig.autofmt_xdate(bottom=0.2, rotation=90, ha='left')         

plt.savefig(output_image_name)
4

3 に答える 3

8

Pythonのイディオムは、ジェネレータ式を使用して行をフィルタリングすることです。

sys.stdout.writelines(line for line in sys.stdin if not line.startswith('-'))

または処理コンテキストで:

filtered = (line for line in sys.stdin if not line.startswith('-'))
for line in filtered:
    # ...
于 2012-05-21T15:53:42.427 に答える
1

ファイルを書き換える代わりに、読み取り時、つまりプロットの直前にデータをフィルタリングします。

于 2012-05-21T15:58:11.547 に答える
0

このプログラムは、csvファイルを開き、負の整数で始まる行を削除して、別のファイルに保存します。必要に応じて、わずかな変更を加えて同じファイルでこれを上書きできます。

with open('data.csv', 'r') as f:
    with open('data2.csv', 'w') as g:
        for row in f:
            if row[0] != '-':
                g.write(row)
于 2012-05-21T15:59:06.220 に答える