Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 판다스(Pandas) datetime 열에서 날짜와 시간 분리하는 방법

데이터 분석을 하다 보면 데이터프레임의 datetime 열에서 날짜(date)시간(time)을 각각 분리해야 하는 경우가 자주 발생합니다. 예를 들어 아래와 같이 'datetime' 열 하나만 있는 데이터프레임이 있을 때,

    datetime    date          time
0 2020-01-01 07:00:00 2020-01-06 07:00:00
1 2020-01-02 07:00:00 2020-01-06 07:00:00
2 2020-01-03 07:00:00 2020-01-06 07:00:00
3 2020-01-04 07:00:00 2020-01-06 07:00:00
4 2020-01-05 07:00:00 2020-01-06 07:00:00
5 2020-01-06 07:00:00 2020-01-06 07:00:00

이처럼 날짜와 시간을 별도의 열로 나누는 작업을 수행할 수 있습니다. 이번 글에서는 두 가지 방법을 순서대로 살펴보겠습니다.

방법 1: for 반복문 사용하기

먼저 pd.date_range()를 이용해 'datetime' 열을 가진 데이터프레임을 정의합니다.

pd.DataFrame({'datetime':pd.date_range('2020-01-01 07:00',periods=6)})

그다음 for 반복문으로 df['datetime'] 열의 값을 하나씩 순회하면서, 각 값에서 날짜와 시간을 추출해 df['date']df['time'] 열에 저장합니다.

for d in df['datetime']:
    df['date'] = d.date()
    df['time'] = d.time()

예제 코드

아래 전체 코드를 실행하면 동작 과정을 쉽게 이해할 수 있습니다.

import pandas as pd
df = pd.DataFrame({'datetime':pd.date_range('2020-01-01 07:10',periods=6)})
print("DataFrame is:\n", df)
for d in df['datetime']:
    df['date'] = d.date()
    df['time'] = d.time()
print("Date-time-hour-minutes :\n", df)

실행 결과

DataFrame is:
           datetime
0 2020-01-01 07:10:00
1 2020-01-02 07:10:00
2 2020-01-03 07:10:00
3 2020-01-04 07:10:00
4 2020-01-05 07:10:00
5 2020-01-06 07:10:00
Date-time-hour-minutes :
           datetime    date       time
0 2020-01-01 07:10:00 2020-01-06 07:10:00
1 2020-01-02 07:10:00 2020-01-06 07:10:00
2 2020-01-03 07:10:00 2020-01-06 07:10:00
3 2020-01-04 07:10:00 2020-01-06 07:10:00
4 2020-01-05 07:10:00 2020-01-06 07:10:00
5 2020-01-06 07:10:00 2020-01-06 07:10:00

주의: 위 반복문 방식은 스칼라 값을 열 전체에 대입하기 때문에 모든 행이 마지막 반복 값으로 덮어써지는 문제가 있습니다. 실무에서는 아래의 벡터화(vectorized) 방식을 사용하는 것이 훨씬 안전하고 빠릅니다.

방법 2: pd.to_datetime()과 dt 접근자 사용하기 (권장)

가장 깔끔하고 효율적인 방법은 pd.to_datetime() 함수로 열을 datetime 타입으로 변환한 뒤, .dt.date.dt.time 접근자를 사용하는 것입니다.

  • pd.to_datetime(df['datetime']).dt.date → 날짜 부분만 추출하여 df['date']에 저장

  • pd.to_datetime(df['datetime']).dt.time → 시간 부분만 추출하여 df['time']에 저장

예제 코드

import pandas as pd
df = pd.DataFrame({'datetime':pd.date_range('2020-01-01 07:10',periods=6)})
print("DataFrame is:\n", df)
df['date'] = pd.to_datetime(df['datetime']).dt.date
df['time'] = pd.to_datetime(df['datetime']).dt.time
print("Date-time-hour-minutes :\n", df)

실행 결과

DataFrame is:
           datetime
0 2020-01-01 07:10:00
1 2020-01-02 07:10:00
2 2020-01-03 07:10:00
3 2020-01-04 07:10:00
4 2020-01-05 07:10:00
5 2020-01-06 07:10:00
Date-time-hour-minutes :
           datetime    date       time
0 2020-01-01 07:10:00 2020-01-01 07:10:00
1 2020-01-02 07:10:00 2020-01-02 07:10:00
2 2020-01-03 07:10:00 2020-01-03 07:10:00
3 2020-01-04 07:10:00 2020-01-04 07:10:00
4 2020-01-05 07:10:00 2020-01-05 07:10:00
5 2020-01-06 07:10:00 2020-01-06 07:10:00

이 방식은 행마다 올바른 날짜와 시간이 정확히 매핑되며, 내부적으로 벡터화 연산이 적용되므로 대용량 데이터에서도 뛰어난 성능을 보입니다.

마무리

정리하면, 판다스에서 datetime 열을 날짜와 시간으로 분리할 때는 .dt.date.dt.time 접근자를 활용하는 것이 가장 권장되는 방법입니다. 추가로 날짜 계산이나 필터링이 필요하다면 .dt.year, .dt.month, .dt.day, .dt.hour 등 다양한 dt 접근자도 함께 활용해 보시기 바랍니다.