You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数组与Datetime变量写入按分钟更新的DataFrame?

实现每分钟记录温度数据到DataFrame的方案

我来帮你搞定这个需求!咱们一步步拆解,从初始化DataFrame到循环记录数据,确保每一步都符合你的要求:

1. 导入所需依赖

先确保你已经安装了pandas、numpy,然后导入所有需要的模块:

import datetime
import time
import numpy as np
import pandas as pd
# 这里假设你已经完成了agilent设备的初始化(比如用pyvisa建立连接)
# agilent = ...  # 你的设备初始化代码

2. 初始化结构匹配的DataFrame

首先得确定DataFrame的列名,比如你读取的是@101:102两个传感器,咱们可以用直观的命名,或者完全按照你要求的FirstValueArray、SecondValueArray格式:

# 先读取一次数据,确定传感器数量
agilent.write("MEAS:TEMP? (@101:102)")
initial_values = np.fromstring(agilent.read(), dtype=float, sep=',')

# 方案1:用你要求的命名格式
columns = ['Datetime'] + [f'{["First", "Second", "Third"][idx]}ValueArray' for idx in range(len(initial_values))]
# 方案2:用传感器编号命名(更直观)
# columns = ['Datetime'] + [f'Sensor{idx+101}' for idx in range(len(initial_values))]

# 初始化空DataFrame
df = pd.DataFrame(columns=columns)

如果传感器数量超过3个,只需要扩展["First", "Second", "Third"]这个列表,或者用循环生成NthValueArray格式的名称即可。

3. 循环读取并添加数据到DataFrame

这里要注意:直接time.sleep(60)会因为读取和处理的耗时导致时间逐渐偏移,所以咱们计算下一次整分钟的时间,确保严格每分钟记录一次:

try:
    while True:
        # 记录当前时间(按你要求的格式)
        now = datetime.datetime.now()
        current_time = now.strftime('%Y-%m-%d %H:%M:%S')
        
        # 读取温度数据
        agilent.write("MEAS:TEMP? (@101:102)")
        values = np.fromstring(agilent.read(), dtype=float, sep=',')
        
        # 组装成一行数据
        row_data = {'Datetime': current_time}
        for idx, val in enumerate(values):
            # 对应你要求的FirstValueArray/SecondValueArray命名
            row_data[f'{["First", "Second", "Third"][idx]}ValueArray'] = val
            # 如果用传感器编号命名,替换成:
            # row_data[f'Sensor{idx+101}'] = val
        
        # 添加到DataFrame(用concat替代已弃用的append)
        df = pd.concat([df, pd.DataFrame([row_data])], ignore_index=True)
        
        # 打印当前记录,方便调试
        print(f"已添加记录: {row_data}")
        
        # 计算到下一分钟的休眠时间,避免时间偏移
        next_minute = now.replace(second=0, microsecond=0) + datetime.timedelta(minutes=1)
        sleep_seconds = (next_minute - datetime.datetime.now()).total_seconds()
        if sleep_seconds > 0:
            time.sleep(sleep_seconds)
            
except KeyboardInterrupt:
    print("\n程序已手动停止")
    # 可选:将最终数据保存到CSV文件
    df.to_csv('temperature_records.csv', index=False)
    print(f"数据已保存到temperature_records.csv,共{len(df)}条记录")

关键细节说明

  • 时间同步:通过计算next_minute保证每次记录都在整分钟点,避免读取耗时导致的时间累积误差。
  • 数据添加:用pd.concat替代已弃用的df.append,ignore_index=True保证索引连续。
  • 容错处理:捕获KeyboardInterrupt(Ctrl+C),方便手动停止程序时保存数据,避免记录丢失。

内容的提问来源于stack exchange,提问作者Algha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:53:09