2016-08-15 84 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''。 –

相关问题