【问题标题】:How do I create a time boxed lookup of events in Python 3?如何在 Python 3 中创建事件的时间盒查找?
【发布时间】:2015-02-07 09:17:15
【问题描述】:

我正在处理事件数据(在本例中为 USGS 地震)。美国地质调查局给你例如所有地震的最后一小时或最后一天以及每隔几分钟列出的更新。 我需要每分钟轮询该列表并对该列表中的新事件采取行动,但忽略我已采取行动的那些。

我可以轻松地创建一个列表,向其中添加新的地震事件:

events = list()
for f in features:

    event = [{
        'name': 'usgs.earthquake.feature', # Time Series Name
        'columns': ['id', 'long', 'lat', 'depth', 'mag', 'type'\
                    'magtype', 'tz', 'felt', 'place', 'status'\
                    'gap', 'dmin', 'rms', 'ids', 'title', 'types'\
                    'cdi', 'net', 'nst', 'sources', 'alert', 'time'\
                    'tsunami', 'code', 'sig'
                    ], # Keys
        'points': [[ f['id'],\
                     f['geometry']['coordinates'][0],\
                     f['geometry']['coordinates'][1],\
                     f['geometry']['coordinates'][2],\
                     f['properties']['mag'],\
                     f['properties']['type'],\
                     f['properties']['magType'],\
                     f['properties']['tz'],\
                     ...
                     f['properties']['time'],\
                     f['properties']['tsunami'],\
                     f['properties']['code'],\
                     f['properties']['sig']
                      ]] # Data points
    }]

    if event in events:
        log.debug('Surpressing duplicate event id: %s', event[0]['points'][0][0])
    else:
        log.debug('Event data: %s', event)

        events.insert(0, event)

        handler.postEvent(event)

    log.debug('Event Cache Count: %s', len(events))

这是一种聪明的方法 - 通过这样的列表构建查找? 我如何最好地保留列表中过去 2 小时或 36 小时的数据,同时丢弃旧的整体?

【问题讨论】:

    标签: python arrays list caching dictionary


    【解决方案1】:

    既然你有一个id 字段,我建议你可以使用字典而不是列表。 (但是id必须是唯一的,不知道是不是这样)

    events = {
        'eventid': Event()
    }
    

    这样,如果事件已保存,您的查询将按预期工作。

    if event in events:
        [..ignore..]
    

    如果还没有:将其添加到字典中:

    events[eventid] = Event(..data..)
    

    如果您还将事件时间戳或日期时间保存在元事件对象中,那么您可以轻松地循环遍历事件字典并使用“del”语句删除某个时间之前的事件。假设您的日期时间字段名为 dt。然后你可以这样做:

    for eventid, event_data in d.items():
        if datetime.utcnow() - event_data['dt'] > timedelta(minutes=20):
            del events[eventid]
    

    这将使超过 20 分钟的事件过期。

    【讨论】:

    • 感谢您的建议。虽然 id 对于事件是唯一的,但事件可以使用更新的更准确的信息进行更新,在这种情况下,我需要重新处理事件。这就是为什么我最初使用列表而不是基于 id 的字典,因此我可以确定我刚刚收到的通风口的任何部分是否与缓存中的现有部分不同。然而,这意味着我不能将时间戳附加到传入事件何时到达我的末端,否则我将无法再比较完整事件。
    • 我仍然建议使用 dict。如果你有 id,你可以简单地从字典中删除事件,以防你收到更新的事件。比较大量参数和数据的成本更高(cpu、内存),因此速度更慢。除非您想跟踪更改,但无论如何您都需要一些更好的逻辑。
    猜你喜欢
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2013-09-16
    • 2020-06-03
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多