使用PIconnect批量获取数据时,如何将DataFrame中重复的AVERAGE列名改为对应点名称
使用PIconnect批量获取数据时,如何将DataFrame中重复的AVERAGE列名改为对应点名称
我之前也碰到过类似的问题,核心原因是每个point.summaries()返回的DataFrame默认都把列名设为AVERAGE,直接拼接自然会出现一堆重复列名。解决思路很简单:在生成每个子DataFrame的时候,就把列名替换成对应的PI点名称,这样拼接后每一列就对应具体的测点了。
方法一:循环中重命名列(最直观)
直接修改你的循环逻辑,在获取每个测点的汇总数据后,立刻把AVERAGE列重命名为测点的名称:
import pandas as pd import PIconnect as PI from PIconnect.PIConsts import SummaryType, TimestampCalculation with PI.PIServer() as server: points = server.search('WTG*_AI_IN_TempA*') data = [] for point in points: # 获取当前测点的汇总数据 df = point.summaries( '5/14/2024', '6/1/2024', '10m', SummaryType.AVERAGE, time_type=TimestampCalculation.EARLIEST_TIME ) # 将默认的AVERAGE列名替换为测点名称 df.rename(columns={'AVERAGE': point.name}, inplace=True) data.append(df) # 拼接所有DataFrame data2 = pd.concat(data, axis=1)
方法二:用列表推导式简化代码
如果喜欢更简洁的写法,可以把重命名操作直接嵌入列表推导:
import pandas as pd import PIconnect as PI from PIconnect.PIConsts import SummaryType, TimestampCalculation with PI.PIServer() as server: points = server.search('WTG*_AI_IN_TempA*') data = [ point.summaries( '5/14/2024', '6/1/2024', '10m', SummaryType.AVERAGE, time_type=TimestampCalculation.EARLIEST_TIME ).rename(columns={'AVERAGE': point.name}) for point in points ] data2 = pd.concat(data, axis=1)
为什么之前的尝试没生效?
你提到之前尝试在循环的不同阶段改列名但没成功,大概率是因为你等到所有DataFrame拼接完成后才处理——此时所有列名都是AVERAGE,Pandas无法区分哪一列对应哪个测点,自然没法准确重命名。而提前在子DataFrame阶段修改,每一列的名称都是唯一的测点名,拼接后就不会有问题了。
额外小技巧:处理多级列名(可选)
如果你不想提前重命名,也可以在拼接时用keys参数标记每个测点,之后再扁平化列名:
with PI.PIServer() as server: points = server.search('WTG*_AI_IN_TempA*') data = [ point.summaries( '5/14/2024', '6/1/2024', '10m', SummaryType.AVERAGE, time_type=TimestampCalculation.EARLIEST_TIME ) for point in points ] # 用keys参数指定每一组数据的名称(测点名称) data2 = pd.concat(data, axis=1, keys=[p.name for p in points]) # 扁平化列名,去掉第二层的AVERAGE data2.columns = data2.columns.droplevel(1)
这种方法适合需要保留原始列名(比如同时获取多种汇总类型时),但如果只取平均值,前两种方法更直接。
备注:内容来源于stack exchange,提问作者Jon Z
相关产品推荐
相关产品推荐

