21.07.20_판다스로 날짜 연산, 활용

우니·2021년 7월 20일
1

판다스

목록 보기
2/2

귀여운 까미를 보고 힘내자 😌

판다스에서 timezone 사용하기

현재 있는 위치를 설정하여
timestampr로 나온 결과를 년월일시와 시분초로 출력할 수 있습니다


import pandas as pd

#unit = s (설정한 데이터가 초단위 임을 명시) 

date = pd.Timestamp(1626746933.284287, unit='s', tz='Asia/Seoul')
print(date,type(date)) 


문자열 형태끼리는 계산이 안 됩니다.
시간을 표현하는 데이터도 문자열로 되어있을 경우 연산이 안 되는데요.
그럴 경우에는 새로운 컬럼을 만들어서 datetime형태로 저장해 주는 방법이 있습니다.


#새로운 컬럼을 만들고 datetime형태로 저장하기 
df['New_Date] = pd.to_datetime(df['Date]) 
df.info() 

#주의! 아래 같이 만들면 안 됩니다 
#df.NewDate


#새로만든 컬럼은 Date와 같은 형태이기 때문에 삭제 
df.drop('Date', inplace=True) 

df['year'] = df['New_Date'].df.year
df['month'] = df['New_Date'].df.month
df['day'] = df['New_Date'].df.day

#New_Date의 값을 컬럼으로 만들기 
df.set_index('New_Date', inplace=True)

#head()를 통해 확인 
df.head()


위의 데이터프레임을 활용하여
지정한 날짜를 대입 할 수 있습니다.


df_ymd_range = df['2018-06-01' : '2018-06-14']
df_ymd_range

날짜가 datetime 형태라면
인덱싱도 할 수 있습니다.

원하는 날짜만 딱! 잘라서 결과를 볼 수 있어요.



df_ym = df.loc['2018-06', 'Start' : 'High']

#출력 
df_ym

time.time()으로 시간을 출력하면 결과는 실수형인 float로 출력됩니다.
float 타입도 datetime으로 변환하는 것을 살펴봅시다.


#파이썬 활용 
t = time.time()

#fromtimestamp활용 
d = datetime.fromtimestamp(t)
print(d, type(d)) 


#판다스 활용 
#to_datetime 
import pandas as pd 
pd.to_datetime(1626747969.0, unit='s')


time series basics


import numpy as np 
from datetime import datetime

dates = {datetime(2011,1,2), datetime(2011,1,5),
datetime(2011,1,7), datetime(2011,1,8),
datetime(2011,1,10), datetime(2011,1,12)] 

ts = pd.Series(no.random.randn(6), index=dates) 



#결과 
2011-01-02   -1.234883
2011-01-05    1.269891
2011-01-07    2.387163
2011-01-08    0.080280
2011-01-10    0.959532
2011-01-12   -0.159513
dtype: float64

날짜 한 개씩 건너뛰어서 보여주기


#처음부터 끝까지 1칸씩 건너 뛰어서 출력 
ts[::2] 


#결과

2011-01-02   -1.234883
2011-01-07    2.387163
2011-01-10    0.959532
dtype: float64

연산하기

ts dataframe과 1칸 씩 건너 뛴 ts dataframe을 빼기


ts + ts[::2]


#각 인덱스와 동일한 값끼리 계산된다
#인덱스가 없을 경우 더할 값이 없기 때문에 NaN 반환 

#결과
2011-01-02   -2.469765
2011-01-05         NaN
2011-01-07    4.774325
2011-01-08         NaN
2011-01-10    1.919063
2011-01-12         NaN
dtype: float64


#NaN이 안 생기도록 fill_value=0을 설정해줌 
#ts.add(ts[::2], fill_value=0)

#인덱스 0번째를 호출하면 가장 처음에 있는 2011년 1월 2일 정보가 나옵니다 
ts.index[0]

Indexing, Selection, Subsetting

stamp = ts.index[2] 
ts[stamp]


#결과 
2011-01-07에 대한 값
2.387163


판다스에서는 자유롭게 날짜 표현 가능


#슬래시로 날짜 지정
print(ts['1/10/2011']) 

#결과 
0.9595317393506101

#콤마 안에 날짜 지정 
ts['20110110']

#결과 
0.9595317393506101

1000개의 관측치가 있는 날짜 데이터 만들기

판다스의 시리즈를 활용합니다.

longer_ts = pd.Seriese(no.random.randn(1000),
index=pd.date_rage('1/1/2000', periods=1000)) 

#결과 
#2000년 1월 1일 부터 1일씩 나아가는 1000개의 날짜 데이터가 생성됨 

#위의 데이터 프레임에서 5월 데이터를 5일 간격으로 출력 

longer_ts['2011-05'][:5]

#결과 
2001-05-01   -1.561267
2001-05-02    1.149984
2001-05-03    0.823273
2001-05-04    2.342749
2001-05-05    0.448408
Freq: D, dtype: float64

ts테이블에서 1월 7일부터 마지막날 데이터까지 추출

ts[datetime(2011,1,7):]

#결과 
2011-01-07    2.387163
2011-01-08    0.080280
2011-01-10    0.959532
2011-01-12   -0.159513
dtype: float64

truncate, before, after

truncate를 사용하면
지정한 날짜에 있는 값들만 나옵니다

  • truncate before, after 순서로 사용
print(ts.truncate(before='2011-01-05', after='2011-01-10')) 

#결과 
2011-01-05    1.269891
2011-01-07    2.387163
2011-01-08    0.080280
2011-01-10    0.959532
dtype: float64

truncate, after

#2011년 1월 9일 이전 값이 나오도록 설정 
print(ts.truncate(after='1/9/2011')) 

#결과 
2011-01-02   -1.234883
2011-01-05    1.269891
2011-01-07    2.387163
2011-01-08    0.080280
dtype: float64

직접 날짜 기간을 지정해서 인덱스 만들기

date_range() 활용합니다


pd.date_range('2020-10-7', '2020-10-20')

#결과 
DatetimeIndex(['2020-10-07', '2020-10-08', '2020-10-09', '2020-10-10',
               '2020-10-11', '2020-10-12', '2020-10-13', '2020-10-14',
               '2020-10-15', '2020-10-16', '2020-10-17', '2020-10-18',
               '2020-10-19', '2020-10-20'],
              dtype='datetime64[ns]', freq='D')

지정한 기간만큼 날짜가 나오도록 지정


#현재 날짜, 시간 출력
now = datetime.now() 

#2주치 데이터가 나오도록 지정 
#weeks=2를 활용 
in_two_weeks = now+timedelta(weeks=2) 

#2주치 날짜 인덱스 만들기 
#date_range활용 
pd.date_range(datetime.now(), in_two_weeks) 

periods 활용

periods 매개변수는 date_range함수에 전달된 시작날짜 시간과, 종료날짜 시간을
periods 매개변수에 설정한 수와 동일하게 나눠 출력합니다.


#2020년 10월 1일부터 2020년 10월 20일까지 5개의 구간으로 나눠서 출력 
pd.date_range(start='2020-10-01', end='2020-10-20', periods=5) 

#결과 
DatetimeIndex(['2020-10-01 00:00:00', '2020-10-05 18:00:00',
               '2020-10-10 12:00:00', '2020-10-15 06:00:00',
               '2020-10-20 00:00:00'],
              dtype='datetime64[ns]', freq=None)


#날짜부분만 출력
#normalize=True 설정 
pd.date_range('2012-05-02 12:56:31', periods=5, normalize=True) 

#결과 
DatetimeIndex(['2012-05-02', '2012-05-03', '2012-05-04', '2012-05-05',
               '2012-05-06'],
              dtype='datetime64[ns]', freq='D')

지정한 요일, 지정한 날짜 개수 만큼 출력하기

date_range(), periods, freq='W-WED 를 활용합니다.


#매주 수요일 간격으로 날짜 데이터 출력 

import numpy as np 
date = pd.date_range('1/1/2000', periods=100, freq='W-WED') 

print(date) 



임의로 지정한 날짜에 인덱스 값 설정


#4일씩 건너뛰는 날짜 데이터프레임 만듬 
long_df = pd.DataFrame(np.random.rand(100,4),
index = dates,
columns=['Colorado','Texas','New York','Ohio']

#6월만 인덱스로 따로 뽑음
long_df.loc['2001-06]


날짜 데이터 프레임에서 unique() 활용

먼저 일부러 중복값이 있는 데이터 프레임을 만듭니다


date = pd.DatetimeIndex(['1/1/2000', '1/2/2000','1/2/2000', '1/2/2000', '1/3/2000'])

dup_ts = pd.Series(np.arange(5), index=dates)

#결과 
2000-01-01    0
2000-01-02    1
2000-01-02    2
2000-01-02    3
2000-01-03    4

isunique()를 활용하여
문자열에 고유문자가 있으면 True를, 아니면 False를 출력합니다

dup_ts.index.is_unique


dup_ts['1/3/2000']

#결과 
4 
중복이 없기 때문에 
2000-01-03이가진 4를 출력합니다 


dup_ts['1/2/2000']


#중복값이 있는 날짜데이터는 슬라이스로 출력됩니다. 

#결과 
2000-01-02    1
2000-01-02    2
2000-01-02    3


#인덱스를 기준으로 groupby()

grouped = dup_ts.groupby(level=0) #level=0은 인덱스를 기준으로 하겠다는 뜻 
print(grouped.mean()) 
grouped.count() 


#결과 
#평균 
2000-01-01    0
2000-01-02    2
2000-01-03    4
dtype: int64


#개수세기
2000-01-01    1
2000-01-02    3
2000-01-03    1
dtype: int64

시간 간격으로 나눠서 출력하기

date_ragne와 freq를 활용합니다

pd.date_range('2001-01-01', '2000-01-03', freq='4h')

#결과 
DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 04:00:00',
               '2000-01-01 08:00:00', '2000-01-01 12:00:00',
               '2000-01-01 16:00:00', '2000-01-01 20:00:00',
               '2000-01-02 00:00:00', '2000-01-02 04:00:00',
               '2000-01-02 08:00:00', '2000-01-02 12:00:00',
               '2000-01-02 16:00:00', '2000-01-02 20:00:00',
               '2000-01-03 00:00:00', '2000-01-03 04:00:00',
               '2000-01-03 08:00:00', '2000-01-03 12:00:00',
               '2000-01-03 16:00:00', '2000-01-03 20:00:00'],
              dtype='datetime64[ns]', freq='4H')

시간끼리 더하기 (분단위로 결과 나옴)

from pandas.tseries.offset import Hour, Minute

#2시간과 30분을 더해라 
Hour(2) + Minute(30)

#결과 
<150 * Minutes>

1시간 30분 단위로 나눈 구역 만들기

freq='시간'을 활용합니다


#2001년 1월 1일부터 10개의 날짜를 1시간 30분 단위로 나눠서 출력하세요

pd.date_range('2001-01-01', periods=10, freq='1h30min')


#결과 
DatetimeIndex(['2000-01-01 00:00:00', '2000-01-01 01:30:00',
               '2000-01-01 03:00:00', '2000-01-01 04:30:00',
               '2000-01-01 06:00:00', '2000-01-01 07:30:00',
               '2000-01-01 09:00:00', '2000-01-01 10:30:00',
               '2000-01-01 12:00:00', '2000-01-01 13:30:00'],
              dtype='datetime64[ns]', freq='90T')

매달, 3번째 주 금요일 날짜 출력하기

freq='WOM-3FRI'활용


#WOM = WEEK OF MONTH > 매 달을 의미
# 3FRI >3번째 주 금요일을 의미 

rng = pd.date_range('2001-01-01, '2012-09-01', freq='WOM-3FRI)

#결과 

DatetimeIndex(['2000-01-21', '2000-02-18', '2000-03-17', '2000-04-21',
               '2000-05-19', '2000-06-16', '2000-07-21', '2000-08-18',
               '2000-09-15', '2000-10-20',
               ...
               '2011-11-18', '2011-12-16', '2012-01-20', '2012-02-17',
               '2012-03-16', '2012-04-20', '2012-05-18', '2012-06-15',
               '2012-07-20', '2012-08-17'],
              dtype='datetime64[ns]', length=152, freq='WOM-3FRI')

profile
데이터와 머신러닝을 배우는 일본사업 마케터입니다

0개의 댓글