我正在尝试读取一些传感器数据,这些数据以 .DBF 格式存储,通常工作得很好。然而,我的一个传感器似乎出现了一些问题,突然间,我常用的脚本不再工作了。
让我澄清一下:每个文件唯一的表格由四列组成(时间、温度、湿度、露点),在某个点(大致跨越第 25 行到第 150 行左右),只有湿度值显然设置为“-- 327”,python 尝试将其转换为浮点数,但显然失败了。从我所做的实验以及该时间跨度之前和之后的值(始终为 0.0)我知道,这些值实际上对我的分析并不感兴趣。
现在我无法理解的是,我正在逐行读取数据(在创建 pandas df 之前我还有其他一些事情要做)并且我认为我已经准备好了对于奇怪的值,通过这样做:
import numpy as np
import dbfread
data = dbfread.DBF(file)
for line in data:
try:
val_humi = line["humidity"]
except Exception:
val_humi = np.nan
print("Error reading the humidity")
default_further_processing_of_read_value_and_df_insertion(val_humi)
虽然可能不是最佳实践,但这通常对我有用,因为我并不真正关心在包含数千个条目的文件中将这几个值设置为 np.nan 。
如何消除收到的错误消息,以便脚本的其余部分可以继续工作?我很感激任何建议。
ValueError: could not convert string to float: b'--327'
附注: 我的第一个想法是直接将dbf加载到pd.dataframe中,但是错误是一样的。
到目前为止,我的下一个最佳想法是手动检查每个读取值(性能不是问题)是否等于“--327”,然后手动将其设置为“0”,但我什至无法到达那里当我尝试提取该值时,就会抛出错误消息。也许有像 <"set_read_data_type" = str> 之类的选项?
提前致谢!
编辑: 也许这也有帮助: 如果我将 dbf 文件导入到 Excel 中,错误值将显示为空单元格,而仅使用 DBFViewer2000 等打开文件会显示 --327 值,Python 也会看到该值。
使用我的 dbf 库,您可以指定自己的浮点转换例程来处理奇怪的错误:
import dbf
def fix_float(string):
try:
return float(string)
except ValueError:
return 0.0
data = dbf.Table(file, default_data_types={'N': fix_float})
data.open()
for record in data:
# do stuff
请注意,
dbf
选择处理数据和数据访问的方式存在一些差异,因此请花几分钟进行探索。
在 dbfread 的文档中,您可以找到如何使用 InvalidValue 子类化 FieldParser 进行管理。