0

60秒ごとにいくつかのデータで更新されるファイルがあります。ファイルの下部から逆方向に読み取れるようにして、過去6時間のデータをグラフにプロットできるようにします。

最初の360行を読み取ることができますが(以下を参照)、これは古いデータです。最新のデータであるファイルの下360行を表示できるようにしたい。私はこれを行う方法がわかりません。エニオンは助けてもらえますか?

import numpy,itertools, matplotlib,datetime 
with open('temperature_logging') as t_in:
 temp = numpy.genfromtxt(itertools.islice(t_in,360),dtype=None,usecols=(0))
 time = numpy.genfromtxt(itertools.islice(t_in,360),dtype=None,usecols=(1))

dates = matplotlib.dates.datestr2num(time)
pylab.savefig('graph.png')
4

1 に答える 1

0

を使用する必要がなくnumpy.genfromtxt()、ファイルの行が一定の長さである(またはゆっくりと変化するか、変数が大きくない)場合は、オフセットを計算し、を使用file.seek()してそのオフセットに到達できます。たとえば、os.stat()ファイルサイズを調べるために使用し、平均行長の360倍とクッションを差し引いて、シークし、読み取ります。

を使用するnumpy.genfromtxt()と、おそらくskip_headerパラメータを使用して、データを読み取る前にスキップする行数を指定できます。たとえば、ファイルの最初の行を読んでファイルがいつ始まったかを調べ、その時点からの分数を計算します。分だとしましょうminutesOld。パラメータリストskip_header = minutesOld - 360内で言います。genfromtxt()

多くの行を2回スキップする必要がないように、同じgenfromtxt呼び出しで時間と一時データを取得します。そのためには、(例)と言います

data = numpy.genfromtxt(t_in, dtype=None, usecols=(0,1), skip_header = minutesOld - 360)

usecols設定または設定を介して、同じ呼び出しで時間と温度のデータを取得できdtypeます。genfromtxtののドキュメントを参照してください。以下に示すコードは前者を示しています。この例の温度ログファイルには約1234行が含まれており、時刻には日付が添付されていません。代わりに、時間は24を超えてカウントされ続けます。ファイル内の行数を計算するコードを調整して、独自の時間表現規則に一致させます。

from numpy import genfromtxt
from itertools import islice
from time import localtime, time

toKeep = 20
with open('temperature_logging') as fin:
    start = genfromtxt(islice(fin,1), dtype=None, usecols=(0,1))
    hf, mf = map(int, start.tolist()[0].split(':'))
    ti = localtime(time())
    hn, mn = ti.tm_hour, ti.tm_min
    print 'File start: {:02d}:{:02d},  Time Now: {:02d}:{:02d}'.format(hf, mf, hn, mn)
    minutesOld = (hn-hf)*60 + mn-mf
    if minutesOld < 0: minutesOld += 24*60
    data = genfromtxt(fin, dtype=None, usecols=(0,1), skip_header = minutesOld - toKeep)

print data

上記のコードからの出力例を次に示します。

File start: 03:43,  Time Now: 00:16
[('23:57', 66.3) ('23:58', 66.8) ('23:59', 66.7) ('24:00', 67.1)
 ('24:01', 66.7) ('24:02', 67.1) ('24:03', 66.8) ('24:04', 67.2)
 ('24:05', 67.4) ('24:06', 67.7) ('24:07', 67.3) ('24:08', 67.1)
 ('24:09', 66.8) ('24:10', 67.3) ('24:11', 67.8) ('24:12', 67.3)
 ('24:13', 67.6) ('24:14', 67.6) ('24:15', 67.7) ('24:16', 67.3)]
于 2012-12-04T05:53:47.033 に答える