Pandas DataFrame导入InfluxDB仅获measurement名,字段无数据求助
我用Python遍历Pandas DataFrame构造Point对象写入InfluxDB,指定了measurement为"measurement2"、时间戳、标签和多个字段,执行无报错,但InfluxDB里只看到measurement名称,所有字段都没有数据。
相关代码
for index, row in df.iterrows(): point = Point("measurement2") \ .time(index, WritePrecision.NS)\ .tag("tag_key", "1") \ .field("hex", row["hex"]) \ .field("PT4_BMS_Bat_Int_Res_Chrg_ST3", row["PT4_BMS_Bat_Int_Res_Chrg_ST3"]) \ .field("PT4_BMS_Bat_Int_Res_Dschrg_ST3", row["PT4_BMS_Bat_Int_Res_Dschrg_ST3"]) \ .field("PT4_BMS_Bat_SOC_Max_ST3", row["PT4_BMS_Bat_SOC_Max_ST3"]) \ .field("PT4_BMS_Bat_SOC_Min_ST3", row["PT4_BMS_Bat_SOC_Min_ST3"]) \ .field("PT4_BMS_Bat_SOC_ST3", row["PT4_BMS_Bat_SOC_ST3"]) \ print(index) print(row["PT4_BMS_Bat_Int_Res_Chrg_ST3"]) # 导入数据 write_api.write(bucket=bucket, org="benz", record=point) time.sleep(1) # 每个点间隔1秒
DataFrame数据
执行print(df.to_dict())输出:
{'hex': {Timestamp('2023-07-15 08:40:26.055830016'): '390e022affffffffffffffffffff0f80ffffffffffffffffffffffffffffffffff470628c8e9ffffffff2a5867f00000', Timestamp('2023-07-15 08:40:27.056139008'): '390e022a69005900090bc15eda8f9e824146444f4a27c69d0581d790b6a3f8d7bc430628c8e9ffffffff952479340000', Timestamp('2023-07-15 08:40:28.056162048'): '390e022a69005900090bc15eda8f9e824146444f4a27c69d0581d790b6a3f8d7bc430628c8e9fffffffff915c4c50000', Timestamp('2023-07-15 08:40:29.056018944'): '390e022a69005900090bc15eda8f9e824146444f4a27c69d0581d790b6a3f8d7bc430628c8e9ffffffff5d9504930000', Timestamp('2023-07-15 08:40:30.056163072'): ...}}
排查方向及解决方法
检查字段数据类型:InfluxDB会忽略不符合类型要求的字段,比如数值字段如果是
NaN或非数值类型(如字符串空值)会被丢弃。先验证字段类型和空值情况:# 查看字段类型 print(df[["PT4_BMS_Bat_Int_Res_Chrg_ST3", "PT4_BMS_Bat_SOC_ST3"]].dtypes) # 统计空值数量 print(df[["PT4_BMS_Bat_Int_Res_Chrg_ST3"]].isna().sum())若存在空值,可选择过滤空值行或填充默认值:
# 过滤空值行 df = df.dropna(subset=["PT4_BMS_Bat_Int_Res_Chrg_ST3", "PT4_BMS_Bat_SOC_ST3"]) # 或填充默认值 df.fillna(0, inplace=True)验证Write API配置:如果使用批处理模式的Write API,需手动触发刷新确保数据写入,否则可能等待批处理阈值触发:
# 在循环结束后调用 write_api.flush()同时确认
bucket和org参数与InfluxDB内的实际名称完全一致(大小写敏感)。检查Point对象结构:写入前打印Point的Line Protocol格式,确认字段是否正确添加:
print(point.to_line_protocol())正常格式示例:
measurement2,tag_key=1 hex="xxx",PT4_BMS_Bat_Int_Res_Chrg_ST3=123 1689400826055830016,若字段未出现在输出中,说明构造Point时存在问题。确认查询语句范围:使用
SELECT * FROM "measurement2"查询全量数据,同时确保查询的时间范围与写入的时间戳匹配,避免因时间范围过滤导致看不到数据。
内容的提问来源于stack exchange,提问作者Reese G

