ํ์ฌ ํด๋น ๋ด์ฉ์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ฝ๋ ์์ฑ์ ์๋ฃํ์์ผ๋ฉฐ ์ต์ข ์์ฑ๋ ์ฝ๋์ ๋ํ ์ค๋ช ์ด๋ค.
์์ ์ฌํญ
1. ํจ์๋ช ์ ๋ช ํํ๊ฒ ๋ณ๊ฒฝ
2. ์๋ณธ ๋ฐ์ดํฐ์ ์กด์ฌํ๋ ์๋ก ๋ค๋ฅธ ํ์์ ๋ผ์ธ ๋ ๊ฐ์ง์ ๋ํ ์ฒ๋ฆฌ ํจ์ + ์๊ฐ ํ์ ๋ณํ ํจ์ + ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ํจ์ ์ด 4๊ฐ๋ก ์ค๊ณ ๋ณ๊ฒฝ
์ฒ์์ ๋ง๋ค์๋ ํ์ ๊ตฌ๋ถ ๋ฐ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ์ฝ๋๋ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋, ํจ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๊ณผ ๋ด์ฉ์ ๊ตฌ๋ถํ๋ ๋ฐฉ์, ๋ฐ์ดํฐ ํ๋ ์ํ ํ์ฌ columns์์ ๋ผ์ธ์ ์ง์ ํ์ฌ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ํด ๋ฐฐ์ธ ์ ์์๋ค.
์์ฑํ๋ ํจ์ ์์ฝ
1. extract_dates_inv
- ๋ ์ง ์ ๋ณด ์ถ์ถ
- year, month, day, current_weekday ๊ฐ ์ถ์ถ
- ๋ฐ์ดํฐ ์ถ์ถ ๋ฐ ์ ์
- ex) 2023๋ => 2023
- ๋ฐ์ดํฐ ์ถ์ถ ๋ฐ ์ ์
2. extract_conversation
- ๋ฉ์์ง ๋ผ์ธ ์ ๋ณด ์ถ์ถ
- name, time, message ๊ฐ ์ถ์ถ
- ์๋ณธ ๋ฐ์ดํฐ์ ์๋ ๋๊ดํธ ์ ๊ฑฐ
3. convert_24hr
- ์๊ฐ ํจ์ 12์๊ฐ ํ์์ 24์๊ฐ ํ์์ผ๋ก ๋ณ๊ฒฝ
- ์๋ณธ ๊ฐ : ์คํ 1:30
- ํจ์ ์ฒ๋ฆฌ ๊ฐ : 13:30
4. generate_dataframe
- ๋ฐ์ดํฐ ์ฒ๋ฆฌํ๊ธฐ
- for๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ผ์ธ๋ณ๋ก ์ํํ๊ณ ์กฐ๊ฑด์ ๋ง๋ ๋ผ์ธ ๊ฐ์ ์์ ๋ง๋ ํจ์์ ๋ณ์๋ฅผ ์ ์ฉํ๋ค.
ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
๋ผ์ด๋ธ๋ฌ๋ฆฌ import
import pandas as pd
import warnings
์ค๋ฅ ๋ฌด์ ํจ์
warnings.simplefilter(action='ignore', category=pd.errors.SettingWithCopyWarning)
- DataFrame์ ์ผ๋ถ๋ฅผ ์์ ํ ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ DataFrame์ ์์ ํ๊ฒ ์ ์ฉ๋์ง ์์ ์ ์์์ ์๋ฆฌ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ ์ฝ๋
- loc ์ธ๋ฑ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
โผ SettingWithCopyWarning์ ๋ํด ๋ ์์๋ณด๊ธฐ
์์ ์ฝ๋
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
df_slice = df[df['A'] > 1]
df_slice['B'] = 0
์์ ์ฝ๋์์ 'df_slice[ 'B' ] = 0' ์์ df_slice๊ฐ ์๋ df์ ๋ณต์ฌ๋ณธ์ธ์ง ๋ทฐ์ธ์ง pandas๊ฐ ํ์ ํ ์ ์๋ค.
- 'df'์ ๋ทฐ๋ผ๋ฉด? df_slice์ ๋ํ ๋ณ๊ฒฝ์ด df์๋ ์ํฅ์ ์ค ์ ์๋ค
- 'df'์ ๋ณต์ฌ๋ณธ์ด๋ผ๋ฉด? ์๋ 'df'๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
- ignore ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฒ๋ฆฌํ ์, (loc ์ฌ์ฉ)
df.loc[df['A'] > 1, 'B'] = 0
๋ฐ์ดํฐ ํ๋ ์ ์ฝ๊ธฐ
data = pd.read_table(r"๋ณธ์ธ์ ํ์ผ๋ช
์ฝ์
ํ๊ธฐ")
- ๊ดํธ ์์ ์์ ์ด ๋ฐ์ดํฐํ๋ ์ํ ํ๊ณ ์ถ์ ๋ด์ฉ์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ฉด ๋๋ค.
์นผ๋ผ ๋ณ๊ฒฝ
๋ถ์ํด์ผ ํ ๋ด์ฉ์ ๋ผ์ธ๋ณ๋ก ์์ฑ๋์ด์๋ ๋ด์ฉ์ด๋ค.
index๊ฐ rows์ด๊ณ columns๊ฐ ์ ์ฒ๋ฆฌ ํด์ผ ํ ๋ด์ฉ์ด๊ธฐ ๋๋ฌธ์ data ํ๋ ์์ ์ปฌ๋ผ๋ช ์ 'text' ๋ก ๋ณํํ์ฌ ์ฌ์ฉํ๋ค.
data.columns=['text']
Date ์ ๋ณด ์ถ์ถ ํจ์
ํจ์๋ช : extract_dates_inv
์๋ณธ ๋ฐ์ดํฐ
--------------- 2023๋ 3์ 24์ผ ๊ธ์์ผ ---------------
์ถ์ถ์ ํ์ํ ๊ณผ์
- ๋ฐ์ดํฐ์ ๋ฌด๊ดํ '-' ๊ธฐํธ์ ์๋ค ๊ณต๋ฐฑ ์ ๊ฑฐ ํ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ
- ๋ ์ง ๋ฐ์ดํฐ ๋ถ๋ฆฌ ์ '๋ ', '์', '์ผ' ๋ฌธ์ ์ ๊ฑฐ
- ์์ผ ๋ ์ง ์ ์ฅ
def extract_dates_inv(line):
date = line.strip('- ').split(' ')
year = date[0][:-1]
month = date[1][:-1]
day = date[2][:-1]
current_weekday = date[3]
return year, month, day, current_weekday
๋ฉ์์ง ์ ๋ณด ์ถ์ถ
ํจ์๋ช : extract_conversation
์๋ณธ ๋ฐ์ดํฐ
[์๋นต] [์คํ 2:16] ๐ ์ถ์ ๊ตํ
์ถ์ถ์ ํ์ํ ๊ณผ์
- ๋ฐ์ดํฐ์์ ๋๊ดํธ ์ ๊ฑฐ
- ์ด๋ฆ, ์๊ฐ, ๋ฉ์์ง ๋ด์ฉ ๋ณ์๋ก ๋ถ๋ฆฌ
- Error ๋ฐ์ ์, pass ํ๋ try ํจ์ ์ฌ์ฉ
โผ try, except ์ฌ์ฉ ์ด์
๋ง์ฝ, ์ฌ์ฉํ์ง ์๊ณ ํจ์๋ฅผ ์ถ๋ ฅํ๋ค๊ณ ๊ฐ์ ํ๋ฉด
def extract_conversation(line):
sender, rest = line.split('] [', 1)
name = sender[1:] # ์์ '[' ์ ๊ฑฐ
time, message = rest.split('] ', 1)
return name, time, message
ValueError: not enough values to unpack (expected 2, got 1)
ํด๋น ๋ฌธ๊ตฌ์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ ๋ณ์์ ์์ ์ค์ ์ ๊ณต๋๋ ๊ฐ์ ์๊ฐ ์ผ์นํ์ง ์์ ๋ ๋ฐ์ํ๋ค.
์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉด ํ์์ด ์ฌ๋ฐ๋ฅธ ๊ฒ๋ ์์ง๋ง, ์ฅ๋ฌธ ํ ์คํธ์ ๊ฒฝ์ฐ ํ์๋๋ก๊ฐ ์๋ ๊ธ์๋ง ์ ๋ ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฌํ ๋ฌธ์ฅ์ ๋ชจ๋ ๋ฌด์ํ๊ธฐ ์ํด์ try, expcept ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค.
def extract_conversation(line):
try:
sender, rest = line.split('] [', 1)
name = sender[1:] # ์์ '[' ์ ๊ฑฐ
time, message = rest.split('] ', 1)
return name, time, message
except ValueError:
pass
์๊ฐ ํ์ ๋ณํ ํจ์
ํจ์๋ช : convert_24hr
์๋ณธ ๋ฐ์ดํฐ๊ฐ ์ค์ , ์คํ๊ฐ ์ ํ์๋ 12์๊ฐ ํ์์ ์๊ฐ ํ์์ด๋ค.
์ด๋ฅผ 24์๊ฐ ํ์์ผ๋ก ๋ณํํ๋ ํจ์๋ฅผ ์์ฑํ๋ค.
์ฐ์ ํด๋น ํจ์์ ๋งค๊ฐ๋ณ์ ๊ฐ์ '์ค์ 12:00' ์ ๊ฐ์ ํ์์ ๊ฐ์ด ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ผ๋จ ์ค์ / ์คํ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ ์ค์ 12์๋ 00์๋ก, ์คํ ๊ฐ์ ๋ชจ๋ +12๋ฅผ ํ๋ ์ฝ๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
if๋ฌธ์ ํ์ฉํ์ฌ ์ค์ ์คํ ์กฐ๊ฑด์ ๋๋๊ณ ๊ฐ์ ":" ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๋ฉด hours์ minutes๋ก ๊ตฌ๋ถํ์ฌ hours์ +12๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ๊ตฌํํด์ผ ํ๋ค.
#์๊ฐ 24์๊ฐ ํ์์ผ๋ก ๋ณํ
def convert_24hr(time_str):
if '์ค์ ' in time_str:
time = time_str.replace('์ค์ ', '')
hours, minutes = map(int, time.split(':'))
if hours == 12: # ์ค์ 12์๋ 00์๋ก ๋ณํ
hours = 0
elif '์คํ' in time_str:
time = time_str.replace('์คํ ', '')
hours, minutes = map(int, time.split(':'))
if hours != 12: # ์คํ 12์๋ ๊ทธ๋๋ก ๋๊ณ , ๋๋จธ์ง๋ 12๋ฅผ ๋ํจ
hours += 12
return f"{hours:02}:{minutes:02}"
์ต์ข ๋ฐ์ดํฐ ์ฒ๋ฆฌ
์์ ์์ฑ๋ ํจ์๋ค์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
ํจ์๋ช : generate_dataframe
dataframe์ด๋ผ๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ year, ~ , current_weekday์ธ ๋ ์ง ๋ณ์ ๊ฐ๋ค์ None์ผ๋ก ์ด๊ธฐํํ๋ค.
dataframe = []
year, month, day, current_weekday = None, None, None, None
์ดํ index์ ํ์ ๊ตฌ๋ถํ์ฌ index๋ ๋ฐ๋ณต ์ค์ธ ํ์ ์ธ๋ฑ์ค๋ฅผ, rows๋ ๋ฐ๋ณต ์ค์ธ ํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ rows์ columns๋ฅผ ์ง์ ํ์ฌ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ๊ฐ ๋ผ์ธ์ line์ด๋ผ๋ ๋ณ์์ ์ ์ฅํ๋ค.
for index,rows in data.iterrows():
line = rows['text'].strip()
line์ด๋ผ๋ ๋ณ์์ ์กฐ๊ฑด์ ๋ฌ์์ ๋ ๊ฐ์ง ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๋จผ์ ๋ ์ง ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ํ์ดํ์ผ๋ก ์์ํ๋ line์ ์ฐพ๋๋ค.
if line.startswith('---------------'):
year, month, day, current_weekday = extract_dates_inv(line)
month = str(month).zfill(2)
day = str(day).zfill(2)
๋ ์ง ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ธฐ ์ํด ์์ฑ๋ extract_date_inv ํจ์๋ฅผ ๊ฐ์ ธ์์ year, month, day, current_weekday๋ฅผ ๋ถ๋ฌ์จ๋ค.
๊ทธ๋ฆฌ๊ณ ์ / ์ผ์ ๋ ์๋ฆฌ ์๋ก ํ์ํ๊ธฐ ์ํด .zfill(2)๋ฅผ ์ฌ์ฉํ์ฌ ๋น ์๋ฆฌ๋ 0์ผ๋ก ์ฑ์์ ์ถ๋ ฅ๋๋๋ก ํ๋ค.
๋ฉ์์ง ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ๋๊ดํธ๋ก ์์ํ๋ line์ ์ฐพ๋๋ค.
๋ฉ์์ง ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ์์ธ extract_conversation ํจ์๋ฅผ ๋ถ๋ฌ์์ ๋ณ์๊ฐ์ ๋ชจ๋ result์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ฅ๋ ๊ฐ์ด ์ฌ๋ฐ๋ฅธ ํจ์๊ฐ ์๋๋ผ๋ฉด data ์ ์ถ๊ฐ๋์ด์๋ ์๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ if๋ฌธ์ ์ฌ์ฉํ์ฌ name, time, message ํ์์ด ๋ง์ผ๋ฉด dataframe์ ์ถ๊ฐํ๊ณ , ์๋๋ฉด ๋์ด๊ฐ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
elif line.startswith('['):
result = extract_conversation(line)
if result :
name, time, message = result
time_24hr = convert_24hr(time)
dataframe.append([year, month, day, current_weekday, time_24hr, name, message])
else :
continue
์ต์ข ์ถ๋ ฅ๊ฐ
(message ๊ฐ์ ๋ํ ๋ด์ฉ์ด๋ฏ๋ก ์จ๊น ์ฒ๋ฆฌ ํ์์ต๋๋ค)
์์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํด๋ผ ์ ์์ต๋๋ค.