import os import rrdtool import pandas as pd from datetime import datetime import time # Функция для инициализации базы данных RRD def initialize_rrd_database(rrd_file: str): if not os.path.exists(rrd_file): rrdtool.create( rrd_file, "--step", "60", # Шаг в 60 секунд "DS:temp1_low:GAUGE:120:-40:100", # Температура устройства 1 (нижняя) "DS:temp1_top:GAUGE:120:-40:100", # Температура устройства 1 (верхняя) "DS:temp2_low:GAUGE:120:-40:100", # Температура устройства 2 (нижняя) "DS:temp2_top:GAUGE:120:-40:100", # Температура устройства 2 (верхняя) "RRA:AVERAGE:0.5:1:1440", # Средние значения с шагом 1 минута за сутки "RRA:AVERAGE:0.5:60:720" # Средние значения с шагом 1 час за месяц ) print(f"Создана база данных: {rrd_file}") else: print(f"База данных уже существует: {rrd_file}") # Функция для получения последней временной метки из RRD базы данных def get_last_update(rrd_file: str): if os.path.exists(rrd_file): info = rrdtool.info(rrd_file) return info["last_update"] return 0 # Функция обновления базы данных RRD def update_rrd_database(rrd_file: str, timestamp: int, t1_low: float, t1_top: float, t2_low: float, t2_top: float): try: rrdtool.update(rrd_file, f"{timestamp}:{t1_low}:{t1_top}:{t2_low}:{t2_top}") human_readable_time = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') print(f"Обновлено: Время: {human_readable_time}, Устр.1: Низ {t1_low}, Верх {t1_top}, Устр.2: Низ {t2_low}, Верх {t2_top}") except Exception as e: print(f"Ошибка обновления базы данных RRD: {e}") # Загрузка и очистка данных из CSV def load_and_clean_csv(file_path): data = pd.read_csv(file_path, sep=';', skiprows=3, names=["time", "down", "top"]) data = data.dropna() # Удаление пустых строк data["down"] = pd.to_numeric(data["down"], errors='coerce') data["top"] = pd.to_numeric(data["top"], errors='coerce') data = data.dropna() # Удаление строк с некорректными значениями data["timestamp"] = data["time"].apply(lambda x: int(time.mktime(datetime.strptime(x, "%d-%m-%Y %H:%M:%S").timetuple()))) return data # Пути к CSV и RRD файлам csv_file1 = "ПБКТ-2-Ш.6линия.csv" csv_file2 = "ПБКТ-3-Ш.1линия.csv" rrd_file = "temperature_data.rrd" # Инициализация RRD базы данных initialize_rrd_database(rrd_file) # Загрузка данных data1 = load_and_clean_csv(csv_file1) data2 = load_and_clean_csv(csv_file2) # Получение последней временной метки из RRD базы данных last_update = get_last_update(rrd_file) # Слияние данных и фильтрация merged_data = pd.merge(data1, data2, on="timestamp", suffixes=("_device1", "_device2")) merged_data = merged_data[merged_data["timestamp"] > last_update] # Импорт данных в RRD базу for _, row in merged_data.iterrows(): update_rrd_database( rrd_file, int(row["timestamp"]), float(row["down_device1"]), float(row["top_device1"]), float(row["down_device2"]), float(row["top_device2"]), ) print("Импорт данных завершён.")