๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ก Data Analysis/๐Ÿ“‚ Project - Analysis of KakaoTalk (end)

[DA][Python] ์นด์นด์˜คํ†ก ๋Œ€ํ™” ๋‚ด์šฉ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌํ•˜๊ธฐ (2)

by Sun A 2024. 7. 3.

์นด์นด์˜คํ†ก ๋Œ€ํ™” ๋‚ด์šฉ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌํ•˜๊ธฐ (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))

 

์ตœ์ข… ์ถœ๋ ฅ๊ฐ’

 


๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋ ˆ์ž„์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„์— ํ…์ŠคํŠธ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ฑ„ํŒ…๋ฐฉ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋Œ€ํ™”ํ•œ ์‚ฌ๋žŒ๊ณผ ๊ฐ™์ด ์•Œ๊ณ ์‹ถ์€ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.