Python按日期范围(两个日期之间)过滤DBF

时间:2016-08-15 14:25:07

标签: python dbf

我在python3.5中使用dbf库。 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=(?!))

1 个答案:

答案 0 :(得分: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'))