使用 python 有效地将数据导出到 CSV
Posted
技术标签:
【中文标题】使用 python 有效地将数据导出到 CSV【英文标题】:Export data efficiently to CSV using python 【发布时间】:2019-11-25 17:25:37 【问题描述】:我正在使用我的 arduino 分析模拟输入,我正在使用 pyfirmata 库访问 arduino,并且我使用我的 arduino Uno 上的 6 个模拟输入来测量电压。我需要找到一种方法来有效地将这些数据实时输入到 CSV...我不确定最好的方法
任何建议都会有所帮助,但请写出您建议的代码。如果可能的话,我更喜欢使用 Pandas,因为它更容易
从电压 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
【问题讨论】:
您现在的 CSV 输出有什么问题? 使用块大小会有所帮助。 chunk_size 【参考方案1】:您的代码似乎有效,但效率不高。每 500 次迭代,您重写所有数据,而不是最终用新数据更新文件。您可以考虑以这种方式保存它:
if count%500 == 0:
dataframe = pd.DataFrame(data)
dataframe.to_csv('data.csv',mode='a',header=False)
data = []
如果仍然不够快,您可以考虑将数据保存为二进制格式,例如.npy
(numpy 格式),然后再转换为 csv。
【讨论】:
以上是关于使用 python 有效地将数据导出到 CSV的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地将 Postgres 数据从 Query 传输到 S3