2015-02-07 50 views
0

我正在處理事件數據(在本例中是USGS地震)。美國地質勘探局給你所有地震和更新的最後一小時或最後一天,每隔幾分鐘就會列出一次。 我需要每分鐘輪詢一次該列表並針對該列表中的新事件採取行動,但忽略那些我已採取行動的行爲。如何在Python 3中創建時間盒裝查找事件?

我可以輕鬆地創建,我添加新的地震事件,給它一個列表:

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小時,同時放棄較老的條目?

回答

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分鐘以上的事件。

+0

感謝您的建議。儘管id對於事件是唯一的,但事件可以用更新的更準確的信息進行更新,在這種情況下,我需要重新處理事件。這就是爲什麼我最初使用列表而不是基於id的詞典,所以我可以確定我剛收到的發佈的任何部分是否與緩存中的現有部分不同。然而,這意味着我無法將時間戳添加到傳入事件中,因爲它到達了我的終端,或者我無法再比較整個事件。 – fxstein 2015-02-07 16:28:35

+0

我仍然會推薦使用字典。如果你有這個ID,你可以直接從字典中刪除事件,以防你收到一個更新的事件。比較一大堆參數和數據會更昂貴(CPU,內存),因此速度更慢。除了你想跟蹤更改,但是你仍然需要更好的邏輯。 – manuel 2015-02-07 16:31:45