2016-08-15 86 views
1

我在python3.5中使用dbf庫。 DBF表有一列只有日期而沒有時間,另一列只有時間。想要檢索最近五分鐘的記錄。Python過濾一個日期範圍內的DBF(兩個日期之間)

我是新來的這個模塊,目前只看到了兩種方法來獲取存儲在DBF數據的一部分:

首先,與交感神經SQL查詢功能:

records = table.query("SELECT * WHERE (SA03 BETWEEN " + beforedfilter + " AND " + nowdfilter + ") AND (SA04 BETWEEN " + beforetfilter + " AND " + nowtfilter + ")") 

這將是一個熟悉的方法,但返回的記錄是文件中的第一條記錄,而不是在給定的時間範圍內。可能是因爲sql查詢不被模塊支持?或者只是我誤解了我的查詢中的某些內容?另一個奇怪的是,在打印幾條記錄後,我會得到一個例外:UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 3: ordinal not in range(128)。據我所知,表中沒有非ascii字符。

另一種方法是使用模塊的縮小記錄的默認方式。如果我想要找到一個特定的日期和時間,但對於範圍,我沒有線索如何進行。

index = table.create_index(lambda rec: rec.SA03) 
records = index.search(match=(?!)) 
+0

可以使查詢工作,而無需使用變量?最後一個條款永遠不會是真的,是嗎? –

+0

@ joel goldstick:感謝您對第二種情況的更正。我需要這些變量,但是下面是插入變量時字符串的例子:SELECT * WHERE(SA03 BETWEEN 15/08/2016和18/08/2016)AND(SA04 BETWEEN 15:39:25 AND 15 :39:25)。即使我擺脫了第二種情況,我有一個印象就是它試圖轉儲整個表格。並且需要一段時間來處理sql查詢。 – hTech

回答

0

最簡單的方法是有一個過濾功能,可只跟蹤匹配的記錄:

# lightly tested 
def last_five_minutes(record, date_field, time_field): 
    now = dbf.DateTime.now() 
    record_date = record[date_field] 
    try: 
     # if time is stored as HH:MM:SS 
     record_time = dbf.DateTime.strptime(record[time_field], '%H:%M:%S').time() 
     moment = dbf.DateTime.combine(record_date, record_time) 
     lapsed = now - moment 
    except (ValueError, TypeError): 
     # should log exceptions, not just ignore them 
     return dbf.DoNotIndex 
    if lapsed <= datetime.timedelta(seconds=300): 
     # return value to sort on 
     return moment 
    else: 
     # do not include this record 
     return dbf.DoNotIndex 

,然後使用它:

index = table.create_index(
     lambda rec: last_five_minutes(rec, 'date_field', 'time_field')) 
+0

如果我用'index = table.create_index(last_five_minutes('rec','SA03','SA04'))嘗試它'' 我將得到的異常是 文件「./log_user.py」,行176 ,在last_five_minutes 記錄[date_field]不是無 TypeError:字符串索引必須是整數 – hTech

+0

在您的if語句中缺少一個閉括號,並且帶有table.create_index(last_five_minutes)的索引聲明不起作用,因爲last_five_minutes需要參數。 – hTech

+0

@hTech:通過使用lambda修復了'create_index'調用。確保爲你的dbf使用正確的''date_field''和''time_field''。 –

相關問題