在資料科學領域,日期和時間資料的處理是不可或缺的一環。本文將深入比較 Python 和 SAS 在處理日期時間資料方面的異同,並結合實務案例,提供程式碼範例和詳細的「內容解密」,讓讀者能快速上手並應用於實際工作中。
日期物件的建立與操作
Python 使用 datetime 模組處理日期和時間,而 SAS 則使用內建的日期時間函式。以下比較兩者建立日期物件的方式:
Python:
from datetime import date
today = date.today()
print(today) # 輸出:2024-04-14 (範例)
這段程式碼匯入 date 類別,並使用 today() 方法取得今天的日期。Python 的 date 物件以 YYYY-MM-DD 的格式呈現日期。
SAS:
data _null_;
today = today();
put today date9.;
run;
/* 輸出:14APR2024 (範例) */
這段 SAS 程式碼使用 today() 函式取得今天的日期,並使用 date9. 格式輸出,預設格式為 DDMMMYYYY。
時間物件與時間戳記
Python 的 time 類別表示時間,datetime 類別表示時間戳記;SAS 則使用時間格式和日期時間格式來表示。
Python 時間物件:
from datetime import time
current_time = time(12, 30, 45)
print(current_time) # 輸出:12:30:45
這段程式碼建立一個 time 物件,表示 12 點 30 分 45 秒。
SAS 時間物件:
data _null_;
current_time = time(); /* 當前時間 */
put current_time time8.;
run;
time() 函式傳回當前時間,time8. 格式化輸出。SAS 中的時間通常與日期一同儲存,或者以一天中的秒數表示。
日期時間運算與格式化
Python 和 SAS 都支援日期時間運算和格式化,但語法有所不同。以下展示日期時間相減的範例:
Python:
from datetime import date, timedelta
date1 = date(2024, 4, 14)
date2 = date(2024, 4, 20)
difference = date2 - date1
print(difference) # 輸出:6 days, 0:00:00
使用 timedelta 物件計算日期差。Python 直接支援日期物件的相減,傳回 timedelta 物件,表示兩個日期之間的差值。
SAS:
data _null_;
date1 = '14APR2024'd;
date2 = '20APR2024'd;
difference = intck('day', date1, date2);
put difference;
run;
/* 輸出:6 */
intck 函式計算兩個日期之間的差值,需指定計算的單位,例如 ‘day’。
時區處理與格式轉換
Python 的 pytz 或 zoneinfo 模組提供時區處理功能,而 SAS 則使用 timezone 選項和相關函式。以下僅以 Python 為例示範時區轉換:
from datetime import datetime, timezone, timedelta
import pytz
# 建立台北時區的 datetime 物件
tz_taipei = pytz.timezone('Asia/Taipei')
dt_taipei = tz_taipei.localize(datetime(2024, 4, 14, 12, 0, 0))
# 轉換為 UTC 時間
dt_utc = dt_taipei.astimezone(timezone.utc)
print(dt_utc)
這段程式碼示範如何使用 pytz 模組處理時區。首先,我們定義台北時區,然後將一個 datetime 物件本地化到台北時區。接著,我們使用 astimezone() 方法將台北時間轉換為 UTC 時間。
實務案例:銷售資料分析
假設我們有一份銷售資料,需要分析不同日期的銷售額。以下示範如何使用 Python 進行分析:
import pandas as pd
# 建立範例銷售資料
data = {'date': pd.to_datetime(['2024-04-14', '2024-04-15', '2024-04-16']),
'sales': [100, 150, 120]}
sales_df = pd.DataFrame(data)
# 計算每日銷售額
print(sales_df.groupby('date')['sales'].sum())
內容解密:
這段程式碼使用 pandas 函式庫分析銷售資料。首先,我們建立一個包含日期和銷售額的 DataFrame。接著,使用 groupby() 方法按照日期分組,並計算每日的銷售總額。
日期時間處理流程
graph LR
B[B]
E[E]
A[輸入日期時間資料] --> B{Python: 使用 datetime, pytz/zoneinfo, pandas 模組}
B --> C[日期時間物件/DataFrame]
C --> D[運算、格式化、分析]
A --> E{SAS: 使用內建函式和格式}
E --> F[日期時間值/資料集]
F --> G[運算、格式化、分析]
D --> H[輸出結果]
G --> H
圖表說明: 此流程圖展示了 Python 和 SAS 處理日期時間資料的基本步驟,包含資料輸入、處理和輸出。
本文比較了 Python 和 SAS 在日期時間資料處理方面的特性,涵蓋了日期時間物件的建立、運算、格式化、時區處理以及實務案例。透過理解兩者的異同,讀者可以根據實際需求選擇合適的工具,並有效地處理日期時間資料。
```python
import saspy
import sys
import pandas as pd
import numpy as np
from datetime import datetime, timedelta, date
import matplotlib.pyplot as plt
# 設定亂數種子,確保結果可重複
np.random.seed(seed=123456)
# 建立範例 Pandas DataFrame
date_today = date.today()
days = pd.date_range(date_today, date_today + timedelta(20), freq='D')
data = np.random.randint(100, high=10000, size=len(days))
df_dates = pd.DataFrame({'dates': days, 'rnd_val': data})
# 顯示 DataFrame 的前五行
print(df_dates.head(5))
# 建立與 SAS 的連線
sas = saspy.SASsession(cfgname='winlocal', results='Text')
# 錯誤處理:檢查 SAS 連線是否成功
if sas.SASpid is None:
print('錯誤:saspy 連線失敗,程式終止')
sys.exit()
print('saspy Process ID: ', sas.SASpid)
# 定義 SAS libref
sas.saslib('sas_data', 'BASE', 'C:\data') # 請根據實際路徑修改
# 檢查 libref 是否成功建立
if 'sas_data' not in sas.saslib():
print('錯誤:無法建立 sas_data libref,程式終止')
sys.exit()
# 將 DataFrame 轉換為 SAS 資料集
sas.df2sd(df_dates, 'date_data', 'sas_data')
# 使用 SAS 程式碼處理日期資料
sas_code = """
proc print data=sas_data.date_data;
format dates yymmdd10.;
run;
proc sql;
create table sas_data.date_data_modified as
select dates format=date9., rnd_val
from sas_data.date_data;
quit;
"""
sas.submit(sas_code)
# 將 SAS 資料集轉換回 DataFrame
df_sas_dates = sas.sd2df('date_data_modified', libref='sas_data')
# 顯示轉換後的 DataFrame 的前五行
print(df_sas_dates.head(5))
# 使用 matplotlib 繪製直方圖
plt.figure(figsize=(10, 6))
plt.bar(df_sas_dates['dates'], df_sas_dates['rnd_val'], color='skyblue')
plt.xlabel('日期')
plt.ylabel('隨機數值')
plt.title('日期與隨機數值分佈圖')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
這段程式碼示範瞭如何在 Python 和 SAS 之間進行資料交換,並特別關注日期時間資料的處理。首先,建立一個包含日期和隨機數的 Pandas DataFrame。然後,使用 SASPy 建立與 SAS 的連線,並將 DataFrame 轉換為 SAS 資料集。在 SAS 中,使用 proc print 顯示資料,並使用 proc sql 修改日期格式。最後,將修改後的 SAS 資料集轉換回 Pandas DataFrame,並使用 matplotlib 繪製直方圖。
graph LR
B[B]
D[D]
A[Python DataFrame] --> B{df2sd};
B --> C[SAS Dataset];
C --> D{sd2df};
D --> E[Python DataFrame];
圖表說明: 此流程圖展示了 Python DataFrame 與 SAS Dataset 之間的雙向資料轉換流程,使用 df2sd 將 DataFrame 轉換為 SAS Dataset,以及使用 sd2df 將 SAS Dataset 轉換為 DataFrame。
這個範例展示瞭如何利用 SASPy 在 Python 和 SAS 之間進行高效的資料交換和處理,包含日期時間資料型別的轉換。同時,也示範了錯誤處理機制的重要性,確保程式碼的穩定性和可靠性。
透過整合 Python 和 SAS 的優勢,資料科學家和分析師可以更有效率地進行資料分析和建模,從而獲得更深入的洞察。 這個整合方法也提升了程式碼的可維護性和可重複性,對於團隊協作和專案管理都非常有益。 在實際應用中,可以根據需求調整程式碼,例如修改日期格式、新增資料處理步驟等,以滿足特定的分析需求。 持續學習和探索 SASPy 的更多進階功能,將有助於進一步提升資料分析能力。