Python处理传感器CSV数据:移除方括号引号并新增Datetime列
水质传感器CSV写入格式问题及修复方案
问题说明
我编写了Python代码读取多台水质传感器数据并写入CSV,但生成的CSV存在两个问题:
- 传感器数据被方括号、双引号包裹,无法直接用作结构化数据
- 缺少完整的日期时间列(只有时分秒,没有年月日)
尝试用Pandas的replace方法移除特殊符号,但没解决问题,求技术帮助。
相关代码与CSV示例
传感器数据读取与写入代码
import csv import os import time from gdx import gdx gdx = gdx.gdx() gdx.open(connection='usb') gdx.select_sensors() os.chdir(r"C:\\Users\\") with open('sensor_data.csv', 'a', newline='') as my_data_file: csv_writer = csv.writer(my_data_file) while True: gdx.start(period=100) column_headers = gdx.enabled_sensor_info() csv_writer.writerow(column_headers) for i in range(0,100000): measurements = gdx.read() localtime = time.localtime() result = time.strftime("%I:%M:%S %p", localtime) print(result) combined_rows = [result, measurements] csv_writer.writerow(combined_rows) print(measurements) my_data_file.flush() time.sleep(59.9)
生成的错误格式CSV
DO Concentration (mg/L),DO Saturation (%),Temperature (℃),Pressure (kPa),DO Salinity (mg/L) 11:08:28 PM,"[0.0, 50000.0, 26.399999618530273, 100.69999694824219, 50.0]" 11:09:28 PM,"[0.0, 50000.0, 26.399999618530273, 100.69999694824219, 50.0]" 11:10:28 PM,"[0.0, 50000.0, 26.399999618530273, 100.69999694824219, 50.0]"
失败的修复尝试代码
df = pandas.read_csv("sensor_data.csv", encoding="ISO-8859-1") df = df.replace('\\"','', regex=True) df = df.replace('\[','', regex=True) df = df.replace('\]','', regex=True) df
修复方案
方案1:从写入阶段彻底解决(推荐)
问题根源在于:
- 每次循环都重复写入表头,导致CSV结构混乱
- 直接把
measurements列表作为单个元素写入,被CSV转成带括号的字符串 - 时间格式只包含时分秒,缺少日期
修改后的写入代码:
import csv import os import time from gdx import gdx gdx = gdx.gdx() gdx.open(connection='usb') gdx.select_sensors() os.chdir(r"C:\\Users\\") csv_path = 'sensor_data.csv' # 检查文件是否已存在,避免重复写表头 file_exists = os.path.isfile(csv_path) with open(csv_path, 'a', newline='') as data_file: csv_writer = csv.writer(data_file) # 仅在文件新建时写入一次表头,新增Datetime列 if not file_exists: headers = ['Datetime'] + gdx.enabled_sensor_info() csv_writer.writerow(headers) gdx.start(period=100) for _ in range(0, 100000): measurements = gdx.read() # 生成包含年月日的完整日期时间 datetime_str = time.strftime("%Y-%m-%d %I:%M:%S %p", time.localtime()) # 把时间和传感器数据展开成一行(直接拆分列表元素) row_data = [datetime_str] + measurements csv_writer.writerow(row_data) print(datetime_str, measurements) data_file.flush() time.sleep(59.9)
方案2:修复已生成的错误CSV
如果已经有了格式错误的CSV文件,用Pandas解析修复:
import pandas as pd from datetime import datetime # 读取CSV,重新指定列名(原表头实际是传感器名称,但数据行结构不一致) df = pd.read_csv("sensor_data.csv", encoding="ISO-8859-1", names=['Datetime', 'Sensor_Data'], header=0) # 清理传感器数据字符串,转成列表 df['Sensor_Data'] = df['Sensor_Data'].str.replace(r'[\[\]" ]', '', regex=True).str.split(',') # 拆分列表为单独的传感器列,对应原表头 sensor_columns = ['DO Concentration (mg/L)', 'DO Saturation (%)', 'Temperature (℃)', 'Pressure (kPa)', 'DO Salinity (mg/L)'] df[sensor_columns] = pd.DataFrame(df['Sensor_Data'].tolist(), index=df.index) # 补全日期(假设数据是今天采集的,可根据实际修改日期) today_date = datetime.today().strftime("%Y-%m-%d") df['Datetime'] = f"{today_date} " + df['Datetime'] # 删除临时数据列,保存修复后的CSV df.drop('Sensor_Data', axis=1, inplace=True) df.to_csv("fixed_sensor_data.csv", index=False) print(df)
内容的提问来源于stack exchange,提问作者levi joseph
相关产品推荐
相关产品推荐

