Python

[Pandas] datetime / dt / dt.isocalendar

HAN___ 2022. 11. 16. 11:01

1. pandas.to_datetime   [공식문서]

- 날짜/시간을 사용하는 datetime 객체로 변환

- 보통 csv 파일 불러왔을 때 날짜가 object로 되어 있는 경우가 많음, 이를 datetime으로 타입 변경

- 날짜/시간 활용도가 높아짐

# ex 1
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
# ex 2
df = pd.DataFrame({'year':[2015, 2016], 
				   'month': [2, 3],
                   'day' : [4, 5]})

pd.to_datetime(df)
>> 0  2015-02-04
   1  2016-03-05
dtype: datetime64[ns]

< format 파라미터에서 활용도 높은 포맷 코드 >

%d : day

%w : weekday를 숫자로(0: Sunday ~ 6: Saturday)

%m: month

%y: year, 뒤에 두 자리(ex. 00, 22)

%Y: year, 4자리 전부(ex. 2000, 2022)

%H: hour, 24시간제

%h: hour, 12시간제

%M: minute

%S: second

 

2. pandas.Series.dt   [공식문서]

- datetime으로 되어 있는 날짜/시간 항목에서 한 가지 항목만 추출

- freq 값에 따라서 추출되는 값이 달라짐(s: 초, h: 시간, q: 분기(1~3월:1, 4~6월:2, 7~9월:3, 10~12월:4) 등)

# ex 1
>>> seconds_series = pd.Series(pd.date_range("2000-01-01", periods=3, freq="s"))
>>> seconds_series
0   2000-01-01 00:00:00
1   2000-01-01 00:00:01
2   2000-01-01 00:00:02
dtype: datetime64[ns]
>>> seconds_series.dt.second
0    0
1    1
2    2
dtype: int64
# ex 2
>>> hours_series = pd.Series(pd.date_range("2000-01-01", periods=3, freq="h"))
>>> hours_series
0   2000-01-01 00:00:00
1   2000-01-01 01:00:00
2   2000-01-01 02:00:00
dtype: datetime64[ns]
>>> hours_series.dt.hour
0    0
1    1
2    2
dtype: int64
# ex 3
>>> quarters_series = pd.Series(pd.date_range("2000-01-01", periods=3, freq="q"))
>>> quarters_series
0   2000-03-31
1   2000-06-30
2   2000-09-30
dtype: datetime64[ns]
>>> quarters_series.dt.quarter
0    1
1    2
2    3
dtype: int64

 

- 데이터프레임의 날짜, 시간을 변환 또는 추가하는 데에도 쓰인다

- ex) df['month'] = df['date'].dt.month (df의 date 컬럼에서 month를 추출해서 month 컬럼으로 새로 만든다)

df[column name].dt.date        # YYYY-MM-DD(문자)
df[column name].dt.year         # 연(4자리숫자)
df[column name].dt.month        # 월(숫자)
df[column name].dt.month_name() # 월(문자)

df[column name].dt.day          # 일(숫자)
df[column name].dt.time         # HH:MM:SS(문자)
df[column name].dt.hour         # 시(숫자)
df[column name].dt.minute       # 분(숫자)
df[column name].dt.second       # 초(숫자)
df[column name].dt.quarter       # 분기(숫자)
df[column name].dt.weekday_name  # 요일이름(문자) (=day_name())
df[column name].dt.weekday       # 요일숫자(0-월, 1-화) (=dayofweek)
df[column name].dt.weekofyear    # 연 기준 몇주째(숫자) (=week)
df[column name].dt.dayofyear     # 연 기준 몇일째(숫자)
df[column name].dt.days_in_month # 월 일수(숫자) (=daysinmonth)
df[column name].dt.is_leap_year     # 윤년 여부
df[column name].dt.is_month_start   # 월 시작일 여부
df[column name].dt.is_month_end     # 월 마지막일 여부
df[column name].dt.is_quarter_start # 분기 시작일 여부
df[column name].dt.is_quarter_end   # 분기 마지막일 여부
df[column name].dt.is_year_start    # 연 시작일 여부
df[column name].dt.is_year_end      # 연 마지막일 여부

(참고: https://moondol-ai.tistory.com/180)

3. pandas.Series.dt.isocalendar   [공식문서]

- ISO 8601 표준에 따라 year, week, day 표시

- 1월 1일이 월요일, 화요일, 수요일, 목요일인 주는 그 주의 월요일부터 일요일까지 그 해의 01주로, 그렇지 않으면 전 년도의 마지막 주(52주 또는 53주)로 계산되다가 오는 월요일부터 그 해의 01주로 계산되며, 매주 월요일마다 값이 하나 늘어난다. (참고)

# ex 1
>>> ser = pd.to_datetime(pd.Series(["2010-01-01", pd.NaT]))
>>> ser.dt.isocalendar()
   year  week  day
0  2009    53     5
1  <NA>  <NA>  <NA>
>>> ser.dt.isocalendar().week
0      53
1    <NA>
Name: week, dtype: UInt32
# ex 2
df['week'] = df['date'].dt.isocalendar().week
df['year'] = df['date'].dt.isocalendar().year

- df의 date 컬럼의 week 값을 isocalendar 값으로 변환하여 새로 week 컬럼으로 추가

- year도 마찬가지

- year은 그대로 그 값이 들어가고, week은 ISO 8601에 따라서 1년 단위에서 몇 번째 주에 해당하는 숫자로 표시된다

'Python' 카테고리의 다른 글

py) return과 print의 차이  (0) 2023.05.03
메소드 오버라이딩과 메소드 오버로딩 in Python  (0) 2022.09.01