使用 python 将数据有效地导出到 CSV



我正在使用我的arduino来分析模拟输入,我正在使用pyfirmata库访问arduino,我基本上使用arduino Uno上的6个模拟输入来测量电压。我需要找到一种方法来有效地将这些数据实时输入 CSV......我不确定最好的方法是什么

任何建议都会有所帮助,但请写出您建议的代码。如果可能的话,我更喜欢使用熊猫,因为它更容易

电压0 到 电压5 是我的变量,我正在尝试以稍后必须分析的漂亮格式报告这些变量

import time
from datetime import datetime
import pyfirmata
import pandas as pd
board = pyfirmata.Arduino('/dev/ttyACM1')
analog_pin0 = board.get_pin('a:0:i')
analog_pin1 = board.get_pin('a:1:i')
analog_pin2 = board.get_pin('a:2:i')
analog_pin3 = board.get_pin('a:3:i')
analog_pin4 = board.get_pin('a:4:i')
analog_pin5 = board.get_pin('a:5:i')
it = pyfirmata.util.Iterator(board)
it.start()
analog_pin0.enable_reporting()
analog_pin1.enable_reporting()
analog_pin2.enable_reporting()
analog_pin3.enable_reporting()
analog_pin4.enable_reporting()
analog_pin5.enable_reporting()
data = []
count = 0
x = 0
start = 0
while x <= 1000:
reading0 = analog_pin0.read()
if reading0 != None:
    voltage0 = reading0 * 5
    voltage0 = round(voltage0,2)
else:
    voltage0 = float('nan')
reading1 = analog_pin1.read()    
if reading1 != None:
    voltage1 = reading1 * 5
    voltage1 = round(voltage1,2)
else:
    voltage1 = float('nan')
reading2 = analog_pin2.read()
if reading2 != None:
    voltage2 = reading2 * 5
    voltage2 = round(voltage2,2)
else:
    voltage2 = float('nan')
reading3 = analog_pin3.read()    
if reading3 != None:
    voltage3 = reading3 * 5
    voltage3 = round(voltage3,2)
else:
    voltage3 = float('nan')
reading4 = analog_pin4.read()
if reading4 != None:
    voltage4 = reading4 * 5
    voltage4 = round(voltage4,2)
else:
    voltage4 = float('nan')
reading5 = analog_pin5.read()    
if reading5 != None:
    voltage5 = reading5 * 5
    voltage5 = round(voltage5,2)
else:
    voltage5 = float('nan')
datarow = {'Voltage0': voltage0, 'Voltage1': voltage1, 'Voltage2' : voltage2, 'Voltage3': voltage3, 'Voltage4' : voltage4, 'Voltage5' : voltage5, 'Time' : time.strftime("%Y-%m-%d_%H:%M:%S")}
data.append(datarow)
if count%500 == 0:
    dataframe = pd.DataFrame(data)
    dataframe.to_csv('data.csv')
x += 1
count += 1
#time.sleep(1)enter code here

您的代码似乎有效,但效率不高。每 500 次迭代,您重写所有数据,而不是最终使用新数据更新文件。您可以考虑以这种方式保存它:

if count%500 == 0:
    dataframe = pd.DataFrame(data)
    dataframe.to_csv('data.csv',mode='a',header=False)
    data = []

如果速度仍然不够快,您可以考虑将数据保存为二进制格式,例如 .npy(numpy 格式(,稍后将其转换为 csv。

最新更新