树莓派传感器数据采集项目:使用Python自动创建以测量起止时间命名的CSV文件技术问询
解决树莓派传感器每小时生成带起止时间的CSV文件问题
我来帮你搞定这个树莓派传感器数据记录的问题!先从修复你现有代码的小问题入手,再实现每小时自动生成CSV的核心需求:
一、先修正现有代码的两个关键问题
- 索引越界错误:你已经注意到
end = df["Date"][len(df)]会报错,因为DataFrame的索引从0开始,最后一条数据的索引是len(df)-1,更简洁的写法是用iloc[-1]直接取最后一行:end = df["Date"].iloc[-1] - 文件名可读性优化:直接拼接start和end会让文件名太冗长,建议用下划线分隔起止时间,比如
start_time_end_time.csv,既清晰又符合文件命名规范。
二、实现每小时自动保存CSV的完整方案
要达成「每小时生成一个带起止时间的CSV」的需求,我们需要:
- 跟踪当前小时,当时间进入下一小时时,自动保存当前数据并重置数据集
- 确保每个CSV文件名包含该小时数据的第一条和最后一条记录的时间
以下是修改后的完整可运行代码:
import Adafruit_DHT import time import datetime import pandas as pd import os dht_sensor = Adafruit_DHT.DHT11 dht_11_pin = 4 # 初始化数据存储和当前跟踪的小时 data = {'Date': [], 'Temperature': [], 'Humidity': []} # 补上湿度列更完整 current_hour = datetime.datetime.now().hour # 可以指定保存目录,避免和程序文件混在一起 save_dir = "/home/pi/sensor_data" os.makedirs(save_dir, exist_ok=True) # 目录不存在就自动创建 def readDht11Values(): humidity, temperature = Adafruit_DHT.read_retry(dht_sensor, dht_11_pin) if humidity is not None and temperature is not None: date_str = datetime.datetime.now().strftime('%m-%d-%Y_%H.%M.%S') return (date_str, temperature, humidity) else: print('DHT11读取失败,跳过本次记录') return (None, None, None) def save_and_reset_data(data): if not data['Date']: # 空数据不保存,避免生成空文件 return {'Date': [], 'Temperature': [], 'Humidity': []} df = pd.DataFrame(data) start_time = df["Date"].iloc[0] end_time = df["Date"].iloc[-1] # 生成规范的文件名 filename = os.path.join(save_dir, f"{start_time}_{end_time}.csv") df.to_csv(filename, index=False) print(f"✅ 已保存文件: {filename}") # 重置数据结构,准备下一小时的记录 return {'Date': [], 'Temperature': [], 'Humidity': []} try: print("传感器数据记录程序启动,按Ctrl+C终止") while True: now = datetime.datetime.now() # 检查是否进入新的小时,是的话保存上一小时的数据 if now.hour != current_hour: data = save_and_reset_data(data) current_hour = now.hour # 读取传感器数据并添加到数据集 date_str, temp, humi = readDht11Values() if date_str and temp is not None and humi is not None: data["Date"].append(date_str) data["Temperature"].append(temp) data["Humidity"].append(humi) # 调整读取间隔,这里设置为5分钟读一次,可按需修改(比如60秒=1分钟) time.sleep(300) except KeyboardInterrupt: # 捕获用户按Ctrl+C的操作,保存最后一批数据再退出 print("\n程序终止,正在保存最后一批数据...") save_and_reset_data(data) print("✅ 最后一批数据已保存,程序退出")
三、代码关键细节说明
- 小时检测逻辑:通过对比
current_hour和当前时间的小时,自动触发数据保存和重置,无需手动干预 - 模块化设计:把传感器读取、数据保存拆成独立函数,代码更易维护
- 异常处理:捕获
KeyboardInterrupt,确保程序终止时不会丢失最后一批数据 - 数据完整性:补上了湿度列(你原来的代码已经读取了湿度但没记录),数据更完整
四、额外小建议
- 如果传感器读取失败次数较多,可以调整
Adafruit_DHT.read_retry的重试次数,比如read_retry(dht_sensor, dht_11_pin, retries=5) - 可以根据需求调整读取间隔,比如每1分钟读一次就把
time.sleep(300)改成time.sleep(60)
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

