Анализ данных при ведении журнала - PullRequest
0 голосов
/ 25 января 2019

Я делаю некоторую регистрацию данных на последовательном устройстве, используя Python.Я использую программу, предоставленную создателем, только слегка измененную.Прямо сейчас он получает значение только один раз каждые 60 с и выводит строку примерно так:

2019/01/16 00:00, 75F, 24C, 56RH, PM-Amb1: 0, PM-Amb2.5: 1, PM-Amb10: 1, PM1: 0, PM2,5: 1, PM10: 1 2019/01/16 00:01, 76F, 24C, 57RH, PM-Amb1: 0, PM-Amb2,5:1, PM-Amb10: 1, PM1: 0, PM2,5: 1, PM10: 1 2019/01/16 00:02, 76F, 24C, 57RH, PM-Amb1: 0, PM-Amb2,5: 0,PM-Amb10: 0, PM1: 0, PM2,5: 0, PM10: 0 2019/01/16 00:03, 76F, 24C, 57RH, PM-Amb1: 0, PM-Amb2,5: 0, PM-Amb10: 0, PM1: 0, PM2.5: 0, PM10: 0

Я хочу сделать среднечасовое значение этих минутных данных, пока я также собираю и записываю значения минут.

Каков наилучший способ сделать это?Он смотрит на минуты на временной метке и запускает суммирование для каждого значения данных, или я должен сделать что-то более сложное?Я новичок в Python, поэтому я не слишком уверен, как мне следует подходить к этой проблеме.Я хочу создать второй файл, который будет отображать похожие метки времени, но со средним значением 00:00, средним значением 01:00 и т. Д.

Вот код, который у меня есть:

    #!/usr/bin/env python
import time
import serial
import os
import shutil
import subprocess
import json
# Initialize variables.
timestr = time.strftime("%Y%m%d")
output_path = '/home/pi/AirBeam Output/output'+ timestr +'.csv'
server_path = '/var/www/html/output.csv'
config_path = '/home/pi/settings.json'
ser = serial.Serial(
    port='/dev/ttyACM0',
    baudrate = 9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1
)

# Grab and parse the settings.
settings = "";
with open(config_path, 'r') as settings_file:
    settings = json.load(settings_file);
if settings == "":
    print("Malformed settings file")
    exit(1)

counter = 0
delay = int(settings["delay"])
use_date = int(settings["date"])
use_ntp = int(settings["ntp"])
# Set initial date.
if (use_date == 1) and (use_ntp == 1):
    time.sleep(5)
    subprocess.call(['/home/pi/sync_time.sh'])
# Start measurement loop.
while 1:
    # Empty serial buffer.
    ser.flushInput()
    # Read data.
    x=ser.readline()
    # Parse data.
    data = x.decode('UTF-8').strip().split(' ')
    print(data)
    # Check for good data and output to file.
    if len(data) > 10:
        with open(output_path, 'a') as output:
            if use_date == 1:
                output.write(time.strftime("%Y/%m/%d %H:%M " + "," + data[2] + "," + data[3] + "," + data[4] + "," + data[5] + "," + data[6] + "," + data[7] + "," + data[8] + "," + data[9] + "," + data[10] + "\r\n"))
            else:
                timepoint = (counter * delay) / 60
                output.write(str(timepoint) + "," + data[2] + "," + data[3] + "," + data[4] + "," + data[5] + "," + data[6] + "," + data[7] + "," + data[8] + "," + data[9] + "," + data[10] + "\r\n")
        # Copy output to server directory.
        shutil.copy(output_path, server_path)
    counter += 1
    # Syncy date and time via NTP every 24 hours if needed.
    if (use_date == 1) and (use_ntp == 1) and (counter * delay > 86400):
        counter = 0
        subprocess.call(['/home/pi/sync_time.sh'])
    time.sleep(delay);
...