owen-script/vodynoi/csvtorrd.py
2024-12-22 00:17:37 +03:00

80 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 минуту на 1 день
"RRA:AVERAGE:0.5:60:720" # Средние значения за 1 час на 30 дней
)
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("Импорт данных завершён.")