시간에 따라 주기적으로 수집된 로그 데이터를 시각화해야 하는 경우가 종종 있습니다. 본 글에서는 여러 날짜 폴더에 저장된 CSV 형식의 로그 파일을 Python으로 읽어 들여, 특정 시간 기준 컬럼을 활용해 관심 있는 데이터를 시간 순으로 시각화하는 방법을 소개드립니다.
문제 상황
- 파일은
.csv
또는 유사한 포맷이며, 쉼표로 구분된 텍스트 형식으로 저장됨 - 상위 폴더 아래
YYYYMMDD
형태의 날짜별 폴더가 존재하고, 각 폴더 내에는 5분 간격으로 생성된 로그 파일이 저장됨 - 각 파일의 첫 줄은 컬럼명이 포함되어 있고, 그 아래에는 여러 줄의 데이터가 있음
- 시간 기준은 예를 들어
Timestamp_UTC
같은 컬럼에 저장되어 있으며, 이 값은 UTC(협정 세계시) 기준 - 시각화 대상이 되는 데이터는 예를 들어
Sensor_Value_1
같은 센서 측정값 컬럼이라고 가정
해결 목표
- 날짜별 폴더를 순회하며 로그 파일을 자동으로 읽어 들이고
- 시간 컬럼(
Timestamp_UTC
)을 한국 시간(KST)으로 변환한 뒤 - 관심 있는 컬럼 값을 시간 순으로 정렬
- 두 개 이상의 데이터를 각각 시각화
구현 순서
1. 폴더 및 컬럼 설정
base_folder = './log_data' # 최상위 경로
time_col = 'Timestamp_UTC'
col_1 = 'Sensor_Value_1'
col_2 = 'Sensor_Setpoint'
file_extension = '.csv'
2. 폴더 및 파일 순회
import os
import pandas as pd
from datetime import timezone, timedelta
utc_format = '%Y-%m-%d %H:%M:%S'
data_all = []
for folder_name in sorted(os.listdir(base_folder)):
folder_path = os.path.join(base_folder, folder_name)
if os.path.isdir(folder_path):
for filename in sorted(os.listdir(folder_path)):
if filename.endswith(file_extension):
file_path = os.path.join(folder_path, filename)
try:
df = pd.read_csv(file_path)
if time_col in df.columns and col_1 in df.columns and col_2 in df.columns:
df = df[[time_col, col_1, col_2]].copy()
df[time_col] = pd.to_datetime(df[time_col], format=utc_format, errors='coerce')
df[time_col] = df[time_col].dt.tz_localize('UTC').dt.tz_convert('Asia/Seoul')
data_all.append(df)
except Exception as e:
print(f"파일 오류: {file_path} - {e}")
3. 데이터 정리 및 시각화
import matplotlib.pyplot as plt
if data_all:
df_total = pd.concat(data_all).dropna().sort_values(by=time_col)
# 첫 번째 그래프
plt.figure(figsize=(14, 5))
plt.plot(df_total[time_col], df_total[col_1], marker='o')
plt.title(f'{col_1} 시간 변화 (KST)')
plt.xlabel('시간')
plt.ylabel(col_1)
plt.xticks(rotation=45)
plt.grid(True)
plt.tight_layout()
plt.show()
# 두 번째 그래프
plt.figure(figsize=(14, 5))
plt.plot(df_total[time_col], df_total[col_2], marker='s', color='orange')
plt.title(f'{col_2} 시간 변화 (KST)')
plt.xlabel('시간')
plt.ylabel(col_2)
plt.xticks(rotation=45)
plt.grid(True)
plt.tight_layout()
plt.show()
else:
print("유효한 데이터가 없습니다.")
마무리하며
이번 작업을 통해 Python으로도 특정 형식의 로그 파일들을 시간 기준으로 정리하고 시각화하는 작업을 자동화할 수 있음을 확인할 수 있었습니다.
특히 UTC → KST 변환, 다중 폴더 순회, 예외 처리, 다중 그래프 분리 출력과 같은 현실적인 요구 사항을 고려한 점이 특징입니다.
이러한 방식은 센서 로그, 시스템 상태 기록, 장비 동작 이력 등 다양한 분야에서 폭넓게 응용될 수 있습니다.
반응형
'개발 (Development) > Python' 카테고리의 다른 글
[Python/Docker] Python Docker 이미지에서 취약점 제거하기 (python:3.9.12-slim 기반) (0) | 2025.08.03 |
---|---|
[Python] 문자열 각 단어의 첫 글자를 대문자로 만드는 방법 (0) | 2025.08.03 |
[Python] requests 요청 후 기다리는 로직과 타임아웃 설정 (0) | 2025.07.28 |
[Python] 문자열 2줄 이상인지 확인하는 방법 (0) | 2025.07.28 |
[Python] 딕셔너리에서 정규표현식으로 특정 형식의 키 추출하기 (4) | 2025.07.28 |