์นด์นด์คํก ๋ํ ๋ด์ฉ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌํ๊ธฐ (1) ์ดํด๋ณด๊ธฐ
[Python] ์นด์นด์คํก ๋ํ ๋ด์ฉ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌํ๊ธฐ (1)
๊ฐ์์นด์นด์คํก ์ฑํ ๋ฐฉ์ ๋ํ ๋ด์ฉ์ ๋ค์ด๋ก๋ ํ ํ, ๋ํ ๋ด์ฉ์ ๋ถ์ํ์ฌ ์ ์๋ฏธํ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๋ค.- ์ถํ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ ๋๋ ๋ค์ํ ์ฌ๋๋ค์ด ์ํตํ๋
sundery.tistory.com
์์ ๊ธ์ ์ด์ด์ ์ด๋ฒ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค.
์ฐ์ ๋ฐ์ดํฐ ํ๋ ์์ ๋ง๋ค๊ธฐ ์ ์, ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์คํธ ํ์์ผ๋ก ์ฝ์
ํ ์ ์๋๋ก ๋น ๋ฆฌ์คํธ ๋ณ์๋ฅผ ์ ์ํ๋ค.
data = []
Year, Month, Day, Day_of_Week ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๊ฐ์ฅ ๋จผ์ ๋ ์ง๋ฅผ ๋ํ๋ด๋ year, month, day, weekday ํจ์๋ฅผ ๊ฐ์ ธ์์ current_date๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ ๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ดํด๋ณธ๋ค.
--------------- 2023๋ 3์ 24์ผ ๊ธ์์ผ ---------------
์๋ณธ ๋ฐ์ดํฐ๋ ์์ ๊ฐ์ผ๋ฉฐ ๋ด๊ฐ ์ถ๋ ฅํด์ผ ํ ๊ฐ์ ์๋์ ๊ฐ๋ค
Year = 2023
Month = 03
Day = 24
Day_of_Week = ๊ธ์์ผ
๊ทธ๋ฌ๊ธฐ ์ํด์๋ '-'์ ๊ณต๋ฐฑ์ ์ญ์ ํ๊ณ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋ฐ์ดํฐ๋ง ์ถ์ถํ์ฌ ๋ณ์์ ์ ์ํด์ผ ํ๋ค.
๋จผ์ ์์ ๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐ์ดํฐ์์ ์ฐพ๋ ํจ์๋ฅผ for ๋ฐ๋ณต๋ฌธ์ ํ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ค.
for line in lines:
line = line.strip()
- ์ฒ์์ ํ์ผ์ ๋ผ์ธ๋ณ๋ก ์ฝ์ด๋ด๋๋ก ์ ์ํ ๋ณ์ lines๋ฅผ ๊ฐ์ ธ์์ ๊ฐ ์ค์ ๋ํ๋ผ ์ ์๋ ๋ณ์ line์ ์ ์ํ๋ค.
- ๋ํ line์ ์ฝ์ ๋ ๊ณต๋ฐฑ์ ์์ ์ ์ฝ์ด๋ผ ์ ์๋๋ก strip()ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
์ฐ์ ๋ ์ง ํ์๋ถํฐ ์ฐพ๋๋ค. ๋ ์ง ํ์์ ------------------- ๋ก ์์ํ๊ณ '๋
', '์', '์ผ' ์ด๋ผ๋ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋ค.
if line.startswith('---------------') and '๋
' in line and '์' in line and '์ผ' in line:
์์์ ๋ ์ง ํ์์ ๋ง๋ ๋ผ์ธ์ ์ฐพ์๋ค๋ฉด ๊ฑฐ๊ธฐ์ ๊ฐ ๋ ์ง ํ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
์ฐ์ ๋ฆฌ์คํธ ํ์์ผ๋ก ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ธฐ ์ํด split์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ strip์ ์ฌ์ฉํ์ฌ ํ์ดํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ฉด ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋ ์ ์๋ค.
parts = line.strip('- ').split(' ')
year = parts[0][:-1] # 'YYYY๋
'์์ 'YYYY' ์ถ์ถ
month = parts[1][:-1] # 'M์'์์ 'M' ์ถ์ถ
day = parts[2][:-1] # 'D์ผ'์์ 'D' ์ถ์ถ
current_weekday = parts[3] #์์ผ์์ ์์ผ ์ถ์ถ
- ๊ฐ ๋ถ๋ถ์ [:-1]๊น์ง๋ง ์ ์ํ๋ ์ด์ ๋ ๋ฌธ์ '๋
', '์', '์ผ'์ด ํฌํจ๋์ง ์๋๋ก ํ๊ธฐ ์ํด์์ด๋ค.
- ์์ผ์ ๋ชจ๋ ๋ฌธ์๊ฐ ๋ค ์ถ์ถ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์กฐ๊ฑด์ ์ ๋ ฅํ์ง ์์๋ค.
year, month, day๋ฅผ ํฌํจํด์ current_date๋ผ๋ ๋ณ์๋ฅผ ์ ์ํ๋ค.
์(month)๊ณผ ์ผ(day)๋ ํ ์๋ฆฌ ์ซ์์ฌ๋ ๋ ์๋ฆฌ๋ก ์ถ๋ ฅ๋์ด์ผ ํ๋ฏ๋ก zfill(2)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค.
(zfill์ ๋ฌธ์์ด ๋ฉ์๋๋ก ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ์ง์ ๋ ๊ธธ์ด(2)๋ณด๋ค ์งง์ ๊ฒฝ์ฐ, ์์ '0'์ ์ถ๊ฐํ๋ค.)
current_date = f"{year} {month.zfill(2)} {day.zfill(2)}"
Name, Time, Message ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๋ ์ง ์๋์ ๋ํ ๋ด์ฉ์ ๋ฐ์ดํฐ ์๋ณธ์ ๊ฐ์ ธ์ค๋ฉด ์๋์ ๊ฐ๋ค.
[์๋นต] [์คํ 2:16] ๐ ์ถ์ ๊ตํ
์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ํ์๋ ์๋์ ๊ฐ์์ผ ํ๋ค.
Name = ์๋นต
Time = 14:16
Message =๐ ์ถ์ ๊ตํ
์ฐ์ ๋ ์ง ๋ฐ์ดํฐ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฉ์์ง ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ผ ํ๋ค. (ํด๋น ๋ฐ์ดํฐ๋ for๋ฌธ ์์์ ์ ์๋๋ค.)
๋ชจ๋ ํ
์คํธ์ ๊ณตํต์ ์ธ ๋ถ๋ถ์ด ๋๊ดํธ(' [ ] ') ๊ธฐํธ์ด๋ฏ๋ก ํด๋น ๊ธฐํธ๊ฐ ํฌํจ๋ ๋ผ์ธ์ ์ฐพ๋๋ค.
elif line.startswith('[') and '] [' in line:
๋ฉ์์ง๋ ํ์์ ๋ง์ง ์๋ ๋ผ์ธ์ด ์์ ์๋ ์์ผ๋ try ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๋ค.
(๋ง์ฝ try, expect ํจ์๋ฅผ ์ฐ์ง ์์ผ๋ฉด ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.)
Traceback (most recent call last):
File "c:\Users\wkdtj\OneDrive\desktop\signlab\family-kakao.py", line 58, in <module>
time, message = rest.split('] ', 1)
^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 2, got 1)
์ฐ์ ์์ฑํ ์ฌ๋ ๋จผ์ ์ถ์ถํ๋ค.
name, rest = line.split('] [', 1)
name = name[1:] # ์์ '[' ์ ๊ฑฐ
์์ ๋ฐฉ์์ ๊ฑฐ์น ์ดํ์ ์ถ๋ ฅ๋๋ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ๋ค
name = ์๋นต
rest = ์คํ 2:16] ๐ ์ถ์ ๊ตํ
- ' ] [ ' ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ name๊ณผ rest๊ฐ ๋๋์ด์ก์ผ๋ฉฐ, name์ [์๋นต ์์ 1๋ถํฐ ์ถ์ถ์ด๊ธฐ ๋๋ฌธ์ [0] ์ธ๋ฑ์ค ๊ฐ์ธ ' [ ' ๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ์ถ๋๋ค.
rest์์ time๊ณผ message ๋ํ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๋ ์ ์ถ์ถํ๋ค.
time, message = rest.split('] ', 1)
time_24hr = convert_to_24hr(time) # ์๊ฐ์ 24์๊ฐ ํ์์ผ๋ก ๋ณํ
- ์ฌ๊ธฐ์ ์ถ์ถ๋ time์ 2:16์ด๊ณ , ์ด๋ฅผ 24์๊ฐ ํ์์ผ๋ก ๋ณํํ์ฌ ์ถ๋ ฅํ๊ธฐ ์ํด ์์ ์์ฑํ covert_to_24hr ํจ์๋ฅผ ํ์ฉํ๋ค.
- ๊ทธ๋ผ ์ต์ข ์ถ๋ ฅ๋๋ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ๋ค.
Name = ์๋นต
Time = 14:16
Message =๐ ์ถ์ ๊ตํ
๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด data ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๋ค์ ์ถ๊ฐํด์ผ ํ๋ค.
current_date๊ฐ ํฌํจ๋์ด์๋ data๋ง ์ถ๊ฐ๋๋๋ก ์๋์ ๊ฐ์ด if๋ฌธ๊ณผ append ํจ์๋ฅผ ์จ์ ์ถ๊ฐํด์ค๋ค.
if current_date: # ํ์ฌ ๋ ์ง๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ถ๊ฐ
data.append([current_date, time_24hr, name, message, current_weekday])
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก try๋ฅผ ์ผ์ผ๋ ์์ธ๊ฐ ๋์์ ๋์ ์ฒ๋ฆฌ ๋ฐฉ์์ expect๋ก ์ ์ํด์ฃผ๋ฉฐ ์ฝ๋๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค.
except ValueError:
continue # ํ์์ ๋ง์ง ์๋ ๋ผ์ธ์ ๊ฑด๋๋
์ด์ ๋ฐ์ดํฐ ํ๋ ์์ ์์ฑํด์ค๋ค.
df = pd.DataFrame(data, columns=['Date', 'Time', 'Name', 'Message', 'Day_of_Week'])
- ์ง๊ธ๊น์ง ๋ง๋ค์๋ Date, Time, Name, Message, Day_of_Week์ columns๋ก ์ถ๊ฐํด์ฃผ๊ณ data ๋ฆฌ์คํธ๋ฅผ pandas ํจ์๋ฅผ ์ด์ฉํ์ฌ DataFrame์ผ๋ก ์์ฑํ๋ค.
- ์์ append์ ๋ฃ์๋ ์์์ ๋ง์ถฐ์ columns๋ฅผ ์ ๋ ฅํด์ค์ผ ํ๋ค.
์ฌ๊ธฐ์ Date๋ฅผ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ฉด 2023 3 24 ๋ก ์ถ๋ ฅ๋๊ธฐ ๋๋ฌธ์ Year, Month, Day๋ก ๊ตฌ๋ถํด์ ๋ฐ์ดํฐ ํ๋ ์์ ์ ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ๋ ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์ ์ซ์๋ก ์ถ๋ ฅ๋ ์ ์๋๋ก type์ int๋ก ๋ณ๊ฒฝํด์ค๋ค.
df['Year'] = df['Date'].str.split(' ').str[0].astype(int)
df['Month'] = df['Date'].str.split(' ').str[1].astype(int)
df['Day'] = df['Date'].str.split(' ').str[2].astype(int)
์ด์ ์ํ๋ ์์๋๋ก columns๊ฐ ์ถ๋ ฅ๋ ์ ์๋๋ก ์์๋ฅผ ์ง์ ํ๊ณ ์ถ๋ ฅํ๋ฉด ์ฒ์์ ์ถ๋ ฅํ๊ณ ์ ํ ๊ฐ๋๋ก ์ถ๋ ฅํ ์ ์๋ค.
# ์ปฌ๋ผ ์์ ๋ณ๊ฒฝ
df = df[['Year', 'Month', 'Day', 'Day_of_Week', 'Time', 'Name', 'Message']]
# ๋ฐ์ดํฐํ๋ ์ ์ถ๋ ฅ
print(df.head(10))
์ต์ข ์ถ๋ ฅ๊ฐ

๋ฐ์ดํฐ๋ฅผ ํ๋ ์์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ์ดํ์ ํ ์คํธ๋ฅผ ๋ถ์ํ์ฌ ์ฑํ ๋ฐฉ์์ ๊ฐ์ฅ ๋ง์ด ๋ํํ ์ฌ๋๊ณผ ๊ฐ์ด ์๊ณ ์ถ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๋ฐ ํ์ฉํ ์ ์๋ค.