df.Yr_Mo_Dy = pd.to_datetime(df.Yr_Mo_Dy)
Ans = df.Yr_Mo_Dy
Ans = df.Yr_Mo_Dy.dt.year.unique()
def fix_century(x):
import datetime
year = x.year - 100 if x.year >= 2061 else x.year
return pd.to_datetime(datetime.date(year, x.month, x.day))
# x.year만 변경되고 나머지 month day는 기존 값을 리턴해준다)
df['Yr_Mo_Dy'] = df['Yr_Mo_Dy'].apply(fix_century)
datetime.date(year, x.month, x.day)는 Python의 내장 모듈인 datetime을 사용해서 특정 날짜를 나타내는 객체를 생성하는 코드입니다. datetime.date() 함수는 입력된 년, 월, 일 정보를 바탕으로 날짜를 나타내는 date 객체를 반환하는데, 이 객체는 연, 월, 일 등 날짜 관련 정보를 속성으로 가집니다.
그런 다음 pd.to_datetime() 함수는 이 date 객체를 pandas의 Timestamp 객체로 변환합니다. Timestamp 객체는 시간 관련 다양한 연산을 수행할 수 있게 해주는 pandas의 자료형입니다. 이를 통해 시계열 데이터를 다루기가 더 용이해집니다.
그러니까, 파이썬에서 해당 '문자'를 '날짜'데이터라고 인식할 수 있도록 datetime.date를 쓰고
pandas에서 timestamp로 연산 사용할 수 있도록 to_datetime()을 쓴다는거지
dt는 pandas의 Series 객체에서 날짜와 시간에 관련된 속성들을 접근하거나 함수를 사용할 수 있게 해주는 접근자(Accessor)입니다.
따라서 df.Yr_Mo_Dy.dt.year는 Yr_Mo_Dy 열에 있는 각각의 날짜 값에서 년도 부분을 추출해내는 코드입니다.
df['weekday'] = df.Yr_Mo_Dy.dt.weekday # 월~일 0~6으로 만들어줌
Ans = df['weekday'].head(3).to_frame()
df['weekcheck'] = df['weekday'].map(lambda x : 1 if x in [5,6] else 0)
ans = df.groupby(df.Yr_Mo_Dy.dt.month).mean(numeric_only=True)
df = df.fillna(method='ffill').fillna(method='bfill')
df.isnull().sum()
두개 함수를 혼합해서도 사용가능. 맨 첫번째 행은 ffill이 불가하기 때문 bfill 함수를 붙여줌
Ans = df.groupby(df.Yr_Mo_Dy.dt.to_period('M')).mean(numeric_only=True)
dt.month 를 쓰면 위처럼 년도가 고려되지 않는 월만 나오기 때문에
to_period('M')을 사용
Ans= df[['RPT','VAL']].rolling(7).mean()
def change_date(x):
import datetime
hour = x.split(':')[1] # 예시 데이터 > 2021-05-15:15
date = x.split(":")[0] # :앞쪽
if hour =='24': # 24시면 다음날이어야 하기 때문에 이걸 함
hour ='00:00:00'
FinalDate = pd.to_datetime(date +" "+hour) + datetime.timedelta(days=1)
#pandas의 date stamp + 하루 더하기 timedelta(days=1)
else:
hour = hour +':00:00'
FinalDate = pd.to_datetime(date +" "+hour)
return FinalDate
df['(년-월-일:시)'] = df['(년-월-일:시)'].apply(change_date)
df['dayName'] =df['(년-월-일:시)'].dt.day_name()
weekday()는 숫자 day_name()은 영어
Ans1 = df.groupby(['dayName','PM10등급'],as_index=False).size()
Ans2 = Ans1.pivot(index='dayName',columns='PM10등급',values='size').fillna(0)
피벗 참 중요하다
이렇게 생긴걸
이렇게 바꾼다.
check = len(df['(년-월-일:시)'].diff().unique())
if check ==2:
Ans =True
else:
Ans = False
df['(년-월-일:시)'].diff().unique() #diff는 앞의 값과 뺀 결과
array([ 'NaT', -3600000000000], dtype='timedelta64[ns]') #첫값은 뺄수가 없어서 NaT, 이후는 한시간씩 차이가 나니까 값이 2개만 존재해야함.=시간이 연속적으로 존재
inplace true는 변경한 값을 실제 값에 변경 적용해라
df.set_index('(년-월-일:시)',inplace=True)