1

假设有一个传感器记录每次激活时的日期和时间。我将此数据作为列表存储在 .json 文件中,格式为(例如)“2000-01-01T00:30:15+00:00”。

现在,我要做的是在 python 中导入这个文件并使用 NumPy/Mathplotlib 来绘制这个传感器每天被激活的次数。

我的问题是,使用这些数据,我不知道如何编写一个算法来计算每天激活传感器的次数。(这应该很简单,但由于 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)。

每天计算激活可能类似于:

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 回答