Data analysis/SQL +

[데이터 전처리4] 날짜 다루기2 : Pyspark, Pandas

2022. 7. 31. 16:50

[데이터 전처리4] 날짜 다루기2 


 

  • 오늘날짜 추출하기
  • 지정 날짜/시간 추출하기
  • 날짜/ 시각에서 연, 월, 일 추출하기
  • 문자형'으로 되어 있는 날짜/ 시각에서 연, 월, 일 추출하기

■  Pyspark 

ο  오늘날짜 추출하기

import findspark
findspark.init()

from pyspark.sql import SparkSession
from pyspark.sql.functions import *

 

① Session 생성

# Create SparkSession
spark = SparkSession.builder \
               .appName('SparkByExamples.com') \
               .getOrCreate()
data=[["1"]]
df=spark.createDataFrame(data,["id"])

 

생성된 df

DataFrame[id: string]

 

② 날짜 추출하기

 

(방법1) Pyspark 안에 있는 함수 활용

오늘날짜(dt)와 현재시간(stamp) 컬럼을 넣어줌.

 

 데이터프레임.withColumns('컬럼명', current_date())

 데이터프레임.withColumns('컬럼명', current_timestamp())

df.withColumn("dt",current_date()) \
  .withColumn("stamp",current_timestamp()) \
  .show(truncate=False)

 

(방법2) SQL Select문 연동

spark.sql("SELECT current_date() AS dt
				, current_timestamp() AS stamp")\
     .show(truncate=False)

* truncate=False 적용하면 stamp에 잘림없이 볼 수 있다.

 


ο  지정 날짜/시간 추출하기

# CAST('value' AS 'type')

spark.sql("""SELECT
CAST('2022-07-31' AS date) AS dt,
CAST('2022-07-31 15:22:00' AS timestamp) AS stamp
""")\
     .show(truncate=False)

 

# type 'value'

spark.sql("""SELECT
date '2022-07-31' AS dt,
timestamp '2022-07-31 15:22:00' AS stamp
""")\
     .show(truncate=False)

 

https://sparkbyexamples.com/pyspark/pyspark-sql-date-and-timestamp-functions/

 

PySpark SQL Date and Timestamp Functions - Spark by {Examples}

PySpark Date and Timestamp Functions are supported on DataFrame and SQL queries and they work similarly to traditional SQL, Date and Time are very important if you are using PySpark for ETL. Most of all these functions accept input as, Date type, Timestamp

sparkbyexamples.com


 

ο  날짜/ 시각에서 연, 월, 일 추출하기

# CAST('value' AS TIMESTAMP) 에서 YEAR, MONTH, DAY, HOUR 함수로 연,월,일,시를 추출

spark.sql("""SELECT
stamp,
YEAR(stamp) AS year,
MONTH(stamp) AS month,
DAY(stamp) AS day,
HOUR(stamp) AS hour
FROM
(SELECT CAST('2022-07-31 15:22:00' AS timestamp) AS stamp) AS t
""")\
     .show(truncate=False)


 

ο  문자형'으로 되어 있는 날짜/ 시각에서 연, 월, 일 추출하기

# CAST('value' AS string)로 문자형으로 뽑아서 substring을 통해 추출.

spark.sql("""SELECT
stamp,
substring(stamp, 1, 4) AS year,
substring(stamp, 6, 2) AS month,
substring(stamp, 9, 2) AS day,
substring(stamp, 12, 2) AS hour,
substring(stamp, 1, 7) AS year_month
FROM
(SELECT CAST('2022-07-31 15:22:00' AS string) AS stamp) AS t
""")\
     .show(truncate=False)

 

# CAST( AS string)으로 문자형으로 뽑은 날짜를 SUBSTR(str,pos,len)를 사용해서 연월일시로 추출

spark.sql("""SELECT
stamp,
substr(stamp, 1, 4) AS year,
substr(stamp, 6, 2) AS month,
substr(stamp, 9, 2) AS day,
substr(stamp, 12, 2) AS hour,
substr(stamp, 1, 7) AS year_month
FROM
(SELECT CAST('2022-07-31 15:22:00' AS string) AS stamp) AS t
""")\
     .show(truncate=False)

 

■  Pandas

ο  오늘날짜 추출하기

 

① 필요한 패키지, 모듈 불러오기

import pymysql
import pandas.io.sql as psql
import pandas as pd

 

② MySQL 데이터베이스 연동하기

con = pymysql.connect(host='localhost', user='root', password='1234',
                     db='webmarket', charset='utf8',
                     autocommit=True,
                     cursorclass=pymysql.cursors.DictCursor)
                     
cur = con.cursor()
# SQL을 통해 데이터를 조작하기 위한 Cursor 객체 생성

 

③  sql쿼리 결과 데이터 읽어오기

sql = """SELECT
CURRENT_DATE AS dt,
CURRENT_TIMESTAMP AS stamp
"""
df_now = psql.read_sql(sql, con)
con.close()
df_now

 

날짜함수  .datetime.now()  활용

print (pd.datetime.now())              # 현재 날짜, 시간
print (pd.datetime.now().date())       # 현재 날짜 연, 월, 일
print (pd.datetime.now().year)
print (pd.datetime.now().month)
print (pd.datetime.now().day)
print (pd.datetime.now().hour)
print (pd.datetime.now().minute)
print (pd.datetime.now().second)
print (pd.datetime.now().microsecond)

 

③  -1. 판다스 날짜함수를 통해 추출한 날짜 값들을 문자형으로 변환 → 사전형으로 데이터프레임에 담음.

df_now_pd = pd.DataFrame({
              'dt': [str(pd.datetime.now().date())],      # pd.datetime.now()에서 date만 추출
    	      'stamp': [str(pd.datetime.now())]
            })
df_now_pd


 

ο  지정 날짜/시간 추출하기

~② MySQL 데이터베이스 연동까진 동일.

 

③  sql쿼리 결과 데이터 읽어오기

sql = """SELECT
date '2022-07-31' AS dt,
timestamp '2022-07-31 15:22:00' AS stamp
"""
df_now = psql.read_sql(sql, con)
con.close()

df_now

 

③  -1. 판다스 날짜함수를 통해 추출한 날짜 값들을 문자형으로 변환 → 사전형으로 데이터프레임에 담음.

df_datetime_pd = pd.DataFrame({
    'dt': ['2022-07-31'],
    'stamp': ['2022-07-31 15:22:00']
})
df_datetime_pd

 

df_datetime_pd.info()

 

 

④ string에서 datetime 자료형으로 전환 : pd.to_datetime(컬럼, format='')

 pd.to_datetime() 함수시간 형식의 object 자료형 컬럼을 datetime 형식으로  바꿀 수 있다.

df_datetime_pd['dt'] = pd.to_datetime(df_datetime_pd['dt'], format='%Y-%m-%d')
df_datetime_pd['stamp'] = pd.to_datetime(df_datetime_pd['stamp'], format='%Y-%m-%d %H:%M:%S')
df_datetime_pd


 

ο  날짜/ 시각에서 연, 월, 일 추출하기

~② MySQL 데이터베이스 연동까진 동일.

 

③  sql쿼리 결과 데이터 읽어오기

sql = """SELECT
stamp,
EXTRACT(YEAR FROM stamp) AS year,
EXTRACT(MONTH FROM stamp) AS month,
EXTRACT(DAY FROM stamp) AS day,
EXTRACT(HOUR FROM stamp) AS hour
FROM
(SELECT timestamp '2022-07-31 15:22:00' AS stamp) AS t
"""
df_now = psql.read_sql(sql, con)
con.close()
df_now

 

③  -1. 사전형으로 timstamp 값이 문자형으로 담긴 데이터프레임 df

           → pandas to_datetime 함수로 날짜형식으로 변환

df = pd.DataFrame({'timestamp': ['2022-07-31 15:22:00']})
df['timestamp'] = pd.to_datetime(df['timestamp'], format='%Y-%m-%d %H:%M:%S')
df

 

print (df['timestamp'].dt.date)			# YYYY-MM-DD (문자)
print (df['timestamp'].dt.year)         # 연도(숫자/ 4자리)
print (df['timestamp'].dt.month)        # 월(숫자)
print (df['timestamp'].dt.month_name)   # 월(무자)
print (df['timestamp'].dt.day)          # 일(숫자)
print (df['timestamp'].dt.time)         # HH:MM:SS (문자)
print (df['timestamp'].dt.hour)         # 시(숫자) 
print (df['timestamp'].dt.minute)       # 분(숫자)
print (df['timestamp'].dt.second)       # 초(숫자)
print (df['timestamp'].dt.microsecond)