본문 바로가기
프로그램

[파이썬] 문제 : 3개의 text 파일에서 빠진 날짜 처리해서 merge

by 오디세이99 2023. 5. 9.
728x90
반응형

(문제)

3가지 파일을 합치려고 합니다.

데이터는 아래와 같이 a,b,c 3개의 파일의 일부만 게시했습니다.
보시다시피 저는 2015년~2023년의 각 월별 1일에 맞추어 b,c를 합치고 싶은데,
문제는 월별데이터인 a와 달리 b와 c는 일별 데이터라 1일에 데이터가 열외된 경우도 있다는 것입니다.

 

 
b와 c에 1일의 데이터가 없는경우 b,c에서 1일에 가장 가까운 2~3일이나 전월 30~31일의 데이터로 채워서 합치고 싶은데 방법을 잘 모르고 있습니다.
 
해당 코드를 알려주시면 좋을 것 같습니다!
(코드에 주석도 달아주세요)

DATE a
2023-03-01 5.2
2023-02-01 5.9
2023-01-01 6.34716
2022-12-01 6.44494
2022-11-01 7.13535
2022-10-01 7.76249
2022-09-01 8.21485
2022-08-01 8.22736
2022-07-01 8.41318
2022-06-01 8.93299
2022-05-01 8.50233
2022-04-01 8.22777
2022-03-01 8.51522
2022-02-01 7.95485
2022-01-01 7.59528
2021-12-01 7.19446
2021-11-01 6.86239
2021-10-01 6.23775
2021-09-01 5.38363
2021-08-01 5.18829
2021-07-01 5.22151
2021-06-01 5.28161
2021-05-01 4.91503
2021-04-01 4.13055
2021-03-01 2.63052
2021-02-01 1.69336

DATE b
2023-03-01 1844.9
2023-02-09 1,866.20
2023-02-08 1,877.40
2023-02-07 1,871.70
2023-02-06 1,866.20
2023-02-03 1,862.90
2023-02-02 1,916.30
2023-02-01 1,927.80
2023-01-31 1,929.50
2023-01-30 1,922.90
2023-01-27 1,928.60
2023-01-26 1,929.10
2023-01-25 1,941.20
2023-01-24 1,933.90
2023-01-23 1,927.10
2023-01-20 1,926.40
2023-01-19 1,922.10
2023-01-18 1,904.40
2023-01-17 1,907.20
2023-01-16 1,912.40
2023-01-13 1,918.40
2023-01-12 1,895.50
2023-01-11 1,874.60
2023-01-10 1,871.60
2023-01-09 1,872.70
2023-01-06 1,864.20
2023-01-05 1,834.80
2023-01-04 1,852.80
2023-01-03 1,839.70
2023-01-02 -
2022-12-30 1,819.70
2022-12-29 1,819.50
2022-12-28 1,807.90
DATE c
2023-05-09 3.496
2023-05-08 3.507
2023-05-07 3.45
2023-05-05 3.435
2023-05-04 3.377
2023-05-03 3.364
2023-05-02 3.433
2023-05-01 3.57
2023-04-28 3.433
2023-04-27 3.528
2023-04-26 3.445
2023-04-25 3.4
2023-04-24 3.496
2023-04-21 3.568
2023-04-20 3.536
2023-04-19 3.591
2023-04-18 3.578
2023-04-17 3.606
2023-04-14 3.515
2023-04-13 3.449
2023-04-12 3.4
2023-04-11 3.432
2023-04-10 3.415
2023-04-07 3.413
2023-04-06 3.303
2023-04-05 3.309
2023-04-04 3.339
2023-04-03 3.415
2023-03-31 3.473
2023-03-30 3.547
2023-03-29 3.566
2023-03-28 3.572
2023-03-27 3.539
2023-03-24 3.372
2023-03-23 3.414
2023-03-22 3.451
2023-03-21 3.608
2023-03-20 3.483
2023-03-17 3.438
2023-03-16 3.579
2023-03-15 3.462
2023-03-14 3.685
2023-03-13 3.545
2023-03-10 3.704
2023-03-09 3.907
2023-03-08 3.989
2023-03-07 3.97
2023-03-06 3.964
2023-03-03 3.958
2023-03-02 4.062
2023-03-01 3.994
2023-02-28 3.928

 

 

(방법)

import pandas as pd

a_df = pd.read_csv('data_a.txt',delimiter='\t')           # 파일 읽기
b_df = pd.read_csv('data_b.txt',delimiter='\t')
c_df = pd.read_csv('data_c.txt',delimiter='\t')

a_df['yymm'] = a_df['DATE'].str.slice(start=0, stop=7)   # yymm으로 2023-01 형태로 분리해 새로운 컬럼 만듬
b_df['yymm'] = b_df['DATE'].str.slice(start=0, stop=7)
c_df['yymm'] = c_df['DATE'].str.slice(start=0, stop=7)

last_yymm = ''
for i in range(len(b_df)-1, -1, -1):                   # b에서 월의 첫번째 데이터만 남김
    if last_yymm != b_df.iloc[i]['DATE'][:7]:
        last_yymm = b_df.iloc[i]['DATE'][:7]
    else:
        b_df.drop(i, axis=0, inplace=True)
        
last_yymm = ''
for i in range(len(c_df)-1, -1, -1):                   # c에서 월의 첫번째 데이터만 남김
    if last_yymm != c_df.iloc[i]['DATE'][:7]:
        last_yymm = c_df.iloc[i]['DATE'][:7]
    else:
        c_df.drop(i, axis=0, inplace=True)
        
df = pd.merge(a_df,b_df, how='outer',on='yymm')        # dataframe merge, yymm 컬럼을 중심으로 merge
df = pd.merge(df, c_df, how='outer',on='yymm')

df가 아래와 같이 만들어 집니다. 이후 가공해서 사용하면 됩니다.

728x90
반응형

댓글