首页 > 解决方案 > 如何使用 pyodbc 从 PHD 中提取整数值?

问题描述

我正在尝试使用 Python 3.x 连接到 Honeywell PHD 服务器并提取数据。我正在使用以下语法进行连接:

import pyodbc
import pandas as pd
import numpy as np
connstring = str('Driver={PHD Server x64}; Server=xxx')
conn = pyodbc.connect(connstring, autocommit=True)
cursor = conn.cursor()
query = "SELECT value FROM phd_data where tagno = '36012' \
        and start_timestamp = 'NOW-::1'"
df = pd.read_sql_query(query,conn)
struct.unpack('f',df.loc[0,'VALUE'][:4])[0]

这适用于标签号 36012(和许多其他标签),因为它们的数据类型是浮点数。表 PHD_DATA 中的 VALUE 列返回一个 4096 字节的字节串。大多数字节是 \x00 但有一些常规文本混合在其中似乎与 python 有关,见下文:

b'\xd4]\xf0CD\x00 \x00W\x00r\x00i\x00t\x00e\x00 \x00D\x00a\x00t\x00a\x00 \x00T\x00a\x00b\x00l\x00e\x00\x00\x00t\x00i\x00o\x00n\x00 \x00T\x00a\x00b\x00l\x00e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00.\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x014\x00\xb1\xff\x8ah\xd7\x01\xc1\x91\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00j\x00s\x00o\x00n\x00.\x00p\x00y\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01du\xb1\xff\x8ah\xd7\x01\x0b1\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00n\x00o\x00r\x00m\x00a\x00l\x00i\x00z\x00e\x00.\x00p\x00y\x00\x80\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\xf7\xe9\xb1\xff\x8ah\xd7\x01D(\x00\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00 \x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00t\x00a\x00b\x00l\x00e\x00_\x00s\x00c\x00h\x00e\x00m\x00a\x00.\x00p\x00y\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\xfe\x1b\xae\xff\x8ah\xd7\x01T\x01\x00\x00\x00\x00\x00\x00X\x01\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00_\x00i\x00n\x00i\x00t\x00_\x00_\x00.\x00p\x00y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xbd{\xfe\x8ah\xd7\x01\x9a\xe8\xd1\xe6\x18\xb0\xd7\x01]d\xb0\xff\x8ah\xd7\x01]d\xb0\xff\x8ah\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x10\x00_\x00_\x00P\x00Y\x00C\x00A\x00~\x001\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00_\x00p\x00y\x00c\x00a\x00c\x00h\x00e\x00_\x00_\x00\x00\x00\x00\x00\xaa\xa7u\xfe\x8ah\xd7\x01g\x04\xcf\xe6\x18\xb0\xd7\x01\'~\x05\xff\x8ah\xd7\x01\'~\x05\xff\x8ah\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x10\x00_\x00_\x00P\x00Y\x00C\x00A\x00~\x001\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00_\x00p\x00y\x00c\x00a\x00c\x00h\x00e\x00_\x00_\x00\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\xa7\x10\x9d\xff\x8ah\xd7\x01\xdf\x0e\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00 \x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\x00e\x00a\x00t\x00h\x00e\x00r\x00_\x00f\x00o\x00r\x00m\x00a\x00t\x00.\x00p\x00y\x00p\x00\x00\x00\x00\x00\x00\x00\x14"{\xfe\x8ah\xd7\x01\xbe\x9a\xd1\xe6\x18\xb0\xd7\x01zH\xac\xff\x8ah\xd7\x01zH\xac\xff\x8ah\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\x00o\x00r\x00m\x00a\x00t\x00s\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01D\x0b\xad\xff\x8ah\xd7\x01\xf7\x1f\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00 \x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g\x00b\x00q\x00.\x00p\x00y\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01.\x80\xad\xff\x8ah\xd7\x01=\x87\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h\x00t\x00m\x00l\x00.\x00p\x00y\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00\'\x97{\xfe\x8ah\xd7\x01\x9e\xc1\xd1\xe6\x18\xb0\xd7\x01\xf7\xe9\xb1\xff\x8ah\xd7\x01\xf7\xe9\xb1\xff\x8ah\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00j\x00s\x00o\x00n\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\xd6^\xb2\xff\x8ah\xd7\x01n\x06\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00o\x00r\x00c\x00.\x00p\x00y\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\xb1\xfa\xb2\xff\x8ah\xd7\x01\xe5>\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x00a\x00r\x00q\x00u\x00e\x00t\x00.\x00p\x00y\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\x80\xbd\xb3\xff\x8ah\xd7\x01A"\x02\x00\x00\x00\x00\x00\x000\x02\x00\x00\x00\x00\x00 \x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x00a\x00r\x00s\x00e\x00r\x00s\x00.\x00p\x00y\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01Q2\xb4\xff\x8ah\xd7\x01\xa3\x1b\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00 \x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x00i\x00c\x00k\x00l\x00e\x00.\x00p\x00y\x00x\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01<\x80\xb4\xff\x8ah\xd7\x01\xf3\x8c\x02\x00\x00\x00\x00\x00\x00\x90\x02\x00\x00\x00\x00\x00 \x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x00y\x00t\x00a\x00b\x00l\x00e\x00s\x00.\x00p\x00y\x00\x00\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00\xe5\xe4{\xfe\x8ah\xd7\x01\x9a\xe8\xd1\xe6\x18\xb0\xd7\x01\xc9\xfa\xb9\xff\x8ah\xd7\x01\xc9\xfa\xb9\xff\x8ah\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\x00a\x00s\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\x9ao\xba\xff\x8ah\xd7\x01\xe7\x04\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\x00p\x00s\x00s\x00.\x00p\x00y\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01z\x0b\xbb\xff\x8ah\xd7\x01\x83\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00 \x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\x00q\x00l\x00.\x00p\x00y\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01R\x80\xbb\xff\x8ah\xd7\x01\xaa\xea\x01\x00\x00\x00\x00\x00\x00\xf0\x01\x00\x00\x00\x00\x00 \x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s\x00t\x00a\x00t\x00a\x00.\x00p\x00y\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x80\xeb\xf0m\x8ah\xd7\x01\x80\xeb\xf0m\x8ah\xd7\x01\x80\x8cb\xc3\xd20\xd7\x01\x9f\x1d\x84\xff\x8ah\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00_\x00i\x00n\x00i\x00t\x00_\x00_\x00.\x00p\x00y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I_z\xfe\x8ah\xd7\x01\x9e\x0f\xd2\xe6\x18\xb0\xd7\x01\xdd\xff\x8d\xff\x8ah\xd7\x01\xdd\xff\x8d\xff\x8ah\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x10\x00_\x00_\x00P\x00Y\x00C\x00A\x00~\x001\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x00_\x00p\x00y\x00c\x00a\x00c\x00h\x00e\x00_\x00_\x00 0])\n    >>> mask_zero_div_zero(x, y, result)\n    array([ inf,  nan, -inf])\n    r\x01\x00\x00\x00\xda\x06ignore)\x01Z\x07invalidr\n\x00\x00\x00Fr\x0b\x00\x00\x00)\x0c\xda\nisinstancer\x0e\x00\x00\x00Z\x07ndarrayr\x04\x00\x00\x00r\x0f\x00\x00\x00\xda\x04boolr\x10\x00\x00\x00Z\x07signbitZ\x08errstater\x12\x00\x00\x00r\x13\x00\x00\x00\xda\x03inf)\tr\x15\x00\x00\x00r\x16\x00\x00\x00r\x14\x00\x00\x00Z\x05zmaskZ\tzneg_maskZ\tzpos_maskZ\x08nan_maskZ\x0bneginf_maskZ\x0bposinf_maskr\x18\x00\x00\x00r\x18\x00\x00\x00r\x19\x00\x00\x00\xda\x12mask_zero_div_zeroI\x00\x00\x00s(\x00\x00\x00\x00\x1c\x0c\x02\x04\x02\x08\x01\n\x02\x08\x02\n\x02\x04\x02\x08\x03\x0e\x01\n\x02\x0c\x01\x0e\x01\x18\x01"\x02\x18\x02\x0e\x02\n\x01\n\x01\x0c\x02r\x1f\x00\x00\x00c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00C\x00\x00\x00s\xb2\x00\x00\x00|\x00t\x00k\x08r*t\x01|\x01|\x02|\x03d\x01\x19\x00\x83\x03t\x02|\x03d\x02\x19\x00|\x01|\x02\x83\x03f\x02}\x03n\x84|\x00t\x03k\x08rTt\x01|\x02|\x01|\x03d\x01\x19\x00\x83\x03t\x02|\x03d\x02\x19\x00|\x02|\x01\x83\x03f\x02}\x03nZ|\x00t\x04j\x05k\x08rlt\x01|\x01|\x02|\x03\x83\x03}\x03nB|\x00t\x06k\x08r\x82t\x01|\x02|\x01|\x03\x83\x03}\x03n,|\x00t\x04j\x07k\x08r\x9at\x02|\x03|\x01|\x02\x83\x03}\x03n\x14|\x00t\x08k\x08r\xaet\x02|\x03|\x02|\x01\x83\x03}\x03|\x03S\x00)\x03a\x05\x02\x00\x00\n    Call fill_zeros with the appropriate fill value depending on the operation,\n    with special logic for divmod and rdivmod.\n\n    Parameters\n    ----------\n    op : function (operator.add, operator.div, ...)\n    left : object (np.ndarray for non-reversed ops)\n    right : object (np.ndarray for reversed ops)\n    result : ndarray\n\n    Returns\n    -------\n    result : np.ndarray\n\n    Notes\n    -----\n    For divmod and rdivmod, the `result` parameter and returned `result`\n    is a 2-tuple of ndarray objects.\n    r\x01\x00\x00\x00\xe9\x01\x00\x00\x00)\t\xda\x06divmodr\x1f\x00\x00\x00r\x1a\x00\x00\x00r\x05\x00\x00\x00\xda\x08operator\xda\x08floordivr\x06\x00\x00\x00\xda\x03modr\x07\x00\x00\x00)\x04\xda\x02op\xda\x04left\xda\x05rightr\x14\x00\x00\x00r\x18\x00\x00\x00r\x18\x00\x00\x00r\x19\x00\x00\x00\xda\x13dispatch_fill_zeros\x88\x00\x00\x00s"\x00\x00\x00\x00\x15\x08\x02\x0e\x01\x0e\xfe\x06\x04\x08\x02\x0e\x01\x0e\xfe\x06\x04\n\x03\x0e\x01\x08\x03\x0e\x01\n\x01\x0e\x01\x08\x01\x0c\x01r(\x00\x00\x00)\x0f\xda\x07__doc__r"\x00\x00\x00Z\x05numpyr\x0e\x00\x00\x00Z\x19pandas.core.dtypes.commonr\x02\x00\x00\x00r\x03\x00\x00\x00r\x04\x00\x00\x00Z\x19pandas.core.ops.roperatorr\x05\x00\x00\x00r\x06\x00\x00\x00r\x07\x00\x00\x00r\x1a\x00\x00\x00r\x1f\x00\x00\x00r(\x00\x00\x00r\x18\x00\x00\x00r\x18\x00\x00\x00r\x18\x00\x00\x00r\x19\x00\x00\x00\xda\x08<module>\x01\x00\x00\x00s\x0e\x00\x00\x00\x04\x17\x08\x02\x08\x02\x14\x02\x14\x03\x08(\x08?\x01\x00\x00f\x01|\x03\x00\x00'

请注意上面还有一个模式,例如,您会得到 \x00p\x00y\x00c,如果您删除 \x00,您最终会得到 .pycache 字符串和对 pyp 包的引用等。

因此,对于 tagno 36012,我提取了前 4 个字节并将它们解压缩为浮点数,这很好。我遇到的问题是在不同的 tagno 36964 上尝试相同的查询时,它的数据类型为整数,我的 python 内核死了。我能够做到这一点:

query = "SELECT value FROM phd_data where tagno = '36964' \
        and start_timestamp = 'NOW-::1'"
cursor.execute(query)

但是一旦我尝试从游标中获取行,内核就会思考并死亡。我知道这个标签上有数据,因为我有另一个使用不同接口的程序。我可以查询浮点和 Unicode 类型的标签,但不能查询整数。我可以从此 Tagno 中选择其他列,例如 Tagname、Tagno、Timestamp,但不能选择 Value。

我的第一个问题是我的连接方法是否有问题?

其次 - 当只有前 4 个字节是值本身时,为什么我会得到一个长字节字符串?

第三 - 为什么整数数据类型会在浮点类型不失败时失败?

最后 - 有没有办法我可以只从 PHD_DATA.VALUE 中选择前 4 个字节?

标签: pythonpandaspyodbc

解决方案


推荐阅读