使用Python SDK在Qdrant中过滤日期时间遇解析错误求解决
Qdrant日期过滤时datetime类型解析错误的解决方法
问题描述
使用Qdrant向量数据库的Python SDK按日期时间过滤数据时,触发解析错误:Qdrant期望接收数值类型输入,但实际传入了datetime对象。
简化代码如下:
from datetime import datetime from qdrant_client import QdrantClient # Qdrant客户端配置 qdrant_client = QdrantClient(...) # 待过滤的日期时间对象 datetime_obj = datetime(2024, 2, 22, 10, 4, 28, 658690) # 查询过滤条件 query = { "bool": { "filter": { "range": { "timestamp": {"gte": datetime_obj } } } } } # 执行查询 result = qdrant_client.query(query)
错误信息:
Input should be a valid number:[type=float_type, input_value=datetime.datetime(2024, 2, 22, 10, 5, 46, 966824), input_type=datetime]
解决思路
Qdrant的range过滤器仅支持数值类型(整数、浮点数),无法直接识别datetime对象。核心解决方式是将datetime对象转换为时间戳数值,且需和存入Qdrant时的时间戳格式(秒级/毫秒级、整数/浮点数)保持一致。
具体解决步骤
将datetime对象转换为时间戳
- 若存入数据时用秒级时间戳:
timestamp = datetime_obj.timestamp() # 返回浮点数,示例:1708591468.65869 - 若存入时用毫秒级时间戳:
timestamp = datetime_obj.timestamp() * 1000 # 返回浮点数,示例:1708591468658.69 - 也可转换为整数形式:
timestamp = int(datetime_obj.timestamp()) # 秒级整数,示例:1708591468
- 若存入数据时用秒级时间戳:
修改查询条件,传入时间戳数值
修改后的完整代码:
from datetime import datetime
from qdrant_client import QdrantClient
qdrant_client = QdrantClient(...)
datetime_obj = datetime(2024, 2, 22, 10, 4, 28, 658690)
转换为秒级时间戳
timestamp = datetime_obj.timestamp()
query = {
"bool": {
"filter": {
"range": {
"timestamp": {"gte": timestamp }
}
}
}
}
result = qdrant_client.query(query)
3. **注意事项** - 必须保证过滤时的时间戳格式与**存入Qdrant时的格式完全一致**,否则过滤结果会不符合预期。 - 若存入时是字符串格式的日期,建议先统一转换为时间戳后再存入;若坚持用字符串过滤,需注意字符串比较是字典序逻辑,可能不符合日期的先后顺序判断。 内容的提问来源于stack exchange,提问作者pankaj
相关产品推荐
相关产品推荐

