在資料科學領域,日期和時間資料的處理是不可或缺的一環。本文將深入比較 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 的 pytzzoneinfo 模組提供時區處理功能,而 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 的更多進階功能,將有助於進一步提升資料分析能力。