You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派传感器数据采集项目:使用Python自动创建以测量起止时间命名的CSV文件技术问询

解决树莓派传感器每小时生成带起止时间的CSV文件问题

我来帮你搞定这个树莓派传感器数据记录的问题!先从修复你现有代码的小问题入手,再实现每小时自动生成CSV的核心需求:

一、先修正现有代码的两个关键问题

  1. 索引越界错误:你已经注意到end = df["Date"][len(df)]会报错,因为DataFrame的索引从0开始,最后一条数据的索引是len(df)-1,更简洁的写法是用iloc[-1]直接取最后一行:
    end = df["Date"].iloc[-1]
    
  2. 文件名可读性优化:直接拼接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 23:47:33