1

起動するたびに日付と時刻を記録するセンサーがあるとします。このデータは、「2000-01-01T00:30:15+00:00」などの形式で .json ファイルにリストとして保存されています。

今、私がやりたいことは、このファイルを python にインポートし、NumPy/Mathplotlib を使用して、このセンサーが 1 日に何回アクティブになるかをプロットすることです。

私の問題は、このデータを使用して、センサーが毎日何回アクティブになったかをカウントするアルゴリズムを作成する方法がわからないことです。(これは単純なはずですが、Python の知識が限られているため行き詰まっています)。おそらく、このリストを T ごとに分割し、各録音を日付 (たとえば「2000-01-01」) でビンに入れ、この日付の録音をカウントする方法があります。

センサーが作動した回数をどのように数えますか? (その後、毎日のアクティベーション数を示すプロットを作成しますか?)

4

2 に答える 2

2

まず、JSON ファイルをロードする必要があります。

import json
with open("logfile.json", "r") as logfile:
    records = json.load(logfile)

レコードは、レコードを含むリストまたは辞書になります。

ログファイルが次のようになっていると仮定します。

[u"2000-01-01T00:30:15+00:00",
 u"2000-01-01T00:30:16+00:00",
 ...
 ]

レコードは文字列のリストになります。したがって、日付の解析は次のとおりです。

import datetime
for record in records:
    datepart, _ = record.split("T")
    date = datetime.datetime.strptime(datepart, "%Y-%m-%d")

うまくいけば、それは十分に明確です。"string".split と datetime.strptime を使用するとうまくいくはずですが、ビンに入れるためだけにこれを日付オブジェクトに解析する必要はありませんが、後で作業が簡単になる場合があります。

最後に、ビニングは、リストのディクショナリを使用して非常に簡単にする必要があります。上記の内容から始めて、ビニングを追加しましょう。

import collections
import datetime
date_bins = collections.defaultdict(list)
for record in records:
    datepart, _ = record.split("T")
    date = datetime.datetime.strptime(datepart, "%Y-%m-%d")
    date_bins[date].append(record)

これにより、各キーが日付で、各値がその日に記録されたレコードのリストである辞書が得られます。

おそらく、これを日付で並べ替えたいと思うでしょう (ただし、データが既に順序付けされている場合は、collections.OrderedDict を使用できる場合があります)。

1 日あたりのアクティベーションをカウントすると、次のようになります。

for date in date_bins:
    print "activations on %s: %s"%(date, len(date_bins[date]))

もちろん、その情報を取得して matplotlib が必要とする形式に変換するのはもう少し手間がかかりますが、ここからはそれほど悪くはありません。

于 2012-07-21T18:03:25.323 に答える
1

あなたのjsonファイルが次のようなリストをロードする場合:

j_list = [('2000-01-01T00:30:15+00:00', 'xx'),
          ('2000-01-01T00:30:15+00:00', 'yyy'),
          ('2000-01-02T00:30:15+00:00', 'zzz')]

: これは、json ファイルが最初の要素としてタイムスタンプを持つリストのリストを返すことを前提としています。それに応じて調整します。

dateutil と datetime には、タイムスタンプを解析するためのパーサーがあります。数えるだけだとしても、それはやり過ぎかもしれません。あなたは出来る:

>>> from itertools import groupby
>>> [(k,len(list(l))) for k,l in groupby(j_list,lambda x: x[0][:10])]
[('2000-01-01', 2), ('2000-01-02', 1)]
于 2012-07-21T17:58:41.533 に答える