如何将数组与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
相关产品推荐
相关产品推荐

