在資料科學的領域中,時間是不可或缺的元素。精確處理日期和時間資料,是每位資料分析師的必修課。本文將深入比較 Python 和 SAS 在日期時間處理上的優劣,並提供實務程式碼範例,引領您輕鬆駕馭時間的奧妙。

動態字串格式化:Python 的 strftime() 與 format()

Python 的 strftime() 方法賦予了日期時間格式化的能力,結合 format() 函式,更能實作動態字串格式化,讓您的程式碼更具彈性。以下範例示範如何巧妙結合這兩個函式,動態產生日期時間字串:

from datetime import date

christmas_2019 = date(2019, 12, 25)

formatted_date = f"2019年的聖誕節是年度第{christmas_2019.strftime('%j')}天,落在{christmas_2019.strftime('%A')}"
print(formatted_date)  # 輸出:2019年的聖誕節是年度第359天,落在Wednesday

這段程式碼首先匯入 date 模組,建立日期物件 christmas_2019 代表 2019 年 12 月 25 日。接著,利用 f-string 搭配 strftime() 方法,將日期格式化為一年中的第幾天(%j)和星期幾(%A),最後輸出格式化後的字串。

字串轉日期:Python 的 strptime()

Python 的 strptime() 方法能將字串轉換為日期時間物件,這在處理外部資料時尤其重要。以下範例示範 strptime() 的用法:

from datetime import datetime

date_string = '2019-01-01'
input_format = '%Y-%m-%d'
date_object = datetime.strptime(date_string, input_format)

print(date_object)  # 輸出:2019-01-01 00:00:00
print(type(date_object))  # 輸出:<class 'datetime.datetime'>

這段程式碼將字串 date_string 根據指定的格式 input_format 轉換為日期時間物件 date_object。由於字串只包含日期資訊,時間部分預設為 00:00:00。

SAS 的日期時間處理

SAS 也提供類別似的功能。以下程式碼示範 SAS 如何將字元變數轉換為日期常數:

data _null_;
  dt_string = '2019-01-01';
  date_value = input(dt_string,yymmdd10.);
  string_type = vtype(dt_string);
  date_type = vtype(date_value);

  put '原始字串: ' dt_string /
      '資料型別: ' string_type //
      '日期: ' date_value yymmdd10. /
      '資料型別: ' date_type ;
run;

這段 SAS 程式碼使用 input() 函式將字元變數 dt_string 根據指定的格式 yymmdd10. 轉換為日期常數 date_valuevtype() 函式用於顯示變數的資料型別。

Python 的時間物件與 Epoch

Python 的 time 模組提供時間物件,表示一天中的本地時間,不受特定日期影響。time 模組以 1970 年 1 月 1 日午夜作為 epoch 起始時間。以下程式碼示範如何取得 Python 的 epoch 起始時間:

import time

epoch_time = time.gmtime(0)
print(epoch_time)  # 輸出:time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

gmtime(0) 函式將時間戳記值 0 轉換為 struct_time 物件,表示 epoch 起始時間。struct_time 物件包含一系列時間和日期值,可以透過索引值和屬性名稱存取。

取得當日時間:Python 與 SAS

Python 和 SAS 都提供函式來取得當日時間。Python 的 time.time() 函式傳回自 epoch 以來的秒數,localtime() 函式則將其轉換為可讀的本地時間。SAS 使用 time() 函式取得當日時間。

import time

timestamp = time.time()
local_time = time.localtime(timestamp)

print(timestamp) # 輸出:當前時間戳記 (浮點數)
print(local_time) # 輸出:當前本地時間 (struct_time 物件)

time.time() 傳回一個浮點數,表示當前時間戳記。localtime() 將時間戳記轉換為 struct_time 物件,包含可讀的本地時間資訊。

data _null_;
  current_time = time();
  put current_time datetime.;
run;

SAS 的 time() 函式傳回當前的時間值。

Python time 模組關係圖

  graph LR
    A[Python time 模組] --> B(time.time())
    B --> C{時間戳記(浮點數)}
    A --> D(time.localtime())
    D --> E{struct_time 物件}
    A --> F(time.gmtime())
    F --> G{struct_time 物件(UTC)}

這個圖表展示了 Python time 模組中幾個關鍵函式的關係,以及它們傳回的資料型別。

透過本文的比較和例項,我們深入瞭解了 Python 和 SAS 在日期時間處理方面的特性。希望這些資訊能幫助您更有效地處理時間資料,提升資料分析的效率和精準度。

Python 日期時間操作:SAS 使用者的便捷

身為一位擁有國際技術經驗的台灣技術研究者,我經常需要在 Python 和 SAS 之間切換,處理日期和時間資料。我發現,雖然兩者都能有效處理日期時間,但它們的底層邏輯和操作方式卻大不相同。這篇文章將以我的經驗出發,為 SAS 使用者提供一個 Python 日期時間操作的便捷,幫助您快速上手 Python 的日期時間處理。

Python 與 SAS 日期物件的根本差異

Python 的 date 物件以年、月、日三個整數儲存日期值,遵循格里高利曆。而 SAS 則使用數值表示日期,日期常數記錄的是自 1960 年 1 月 1 日以來的天數。這種差異直接影響了日期時間操作的方式。

  graph LR
    subgraph Python 日期物件
        direction LR
        D["Date 物件"] --> Y(年)
        D --> M(月)
        D --> Day(日)
    end
    subgraph SAS 日期常數
        direction LR
        DC["日期常數"] --> Days["距 1960/1/1 的天數"]
    end

取得今日日期:Python vs. SAS

Python 和 SAS 都提供了取得當前日期的函式。Python 使用 date.today(),而 SAS 使用 today()

Python:

from datetime import date

today_date = date.today()
print(f"今天是:{today_date}")

date.today() 傳回一個 date 物件,代表今天的日期。

SAS:

data _null_;
  today_date = today();
  put "今天是:" today_date date9.;  /* 使用 date9. 格式顯示日期 */
run;

SAS 的 today() 函式傳回一個數值,代表今天距離 1960 年 1 月 1 日的天數。需要搭配格式才能以日期形式顯示。

遺漏值處理:Python 的彈性策略

在 Python 的 Pandas 函式庫中,NaT (Not a Time) 用於表示日期時間型別的遺漏值,這與 SAS 中的缺失值處理方式有所不同。

import pandas as pd
import numpy as np

# 建立示例 DataFrame
data = {'date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03']), 'value': [1, 2, 3]}
df = pd.DataFrame(data)

# 插入遺漏值
df.loc[1, 'date'] = pd.NaT

print(df)

這段程式碼示範瞭如何在 Pandas DataFrame 中插入 NaT 遺漏值。

Python 日期時間計算與操作

Python 的 timedelta 物件讓日期時間計算變得非常直觀。

from datetime import date, timedelta

date1 = date(2024, 1, 1)
date2 = date(2024, 1, 31)

delta = date2 - date1
print(f"日期差:{delta}")  # 輸出:日期差:30 days, 0:00:00

future_date = date1 + timedelta(days=30)
print(f"30 天後的日期:{future_date}")  # 輸出:30 天後的日期:2024-01-31

timedelta 物件可以進行日期加減運算,輕鬆計算日期差或推算未來日期。

星期幾判斷:兩種便捷方法

Python 提供了 weekday()isoweekday() 兩個方法來判斷星期幾。

from datetime import date

today = date.today()

weekday = today.weekday()  # 星期一為 0,星期日為 6
isoweekday = today.isoweekday()  # 星期一為 1,星期日為 7

print(f"今天是星期幾 (0 = 星期一):{weekday}")
print(f"今天是星期幾 (1 = 星期一):{isoweekday}")

weekday()isoweekday() 提供了兩種不同的星期編號方式,可以根據需要選擇使用。

透過以上介紹,相信 SAS 使用者能快速掌握 Python 日期時間操作的核心概念和技巧。Python 的 datetime 模組功能豐富,還有許多進階應用等待您去探索。

希望這篇文章能幫助您在 Python 的世界裡更加遊刃有餘地處理日期時間資料。

解讀 Python 與 SAS 的日期時間魔法

在資料科學的世界裡,日期和時間的處理就像施展魔法般重要。我將帶您探索 Python 和 SAS 如何處理日期時間資料,並分享我多年來的實戰經驗和獨到見解。

星期幾的計算藝術

取得特定日期的星期幾,看似簡單,卻蘊含著程式設計的巧思。Python 的 calendar 模組提供了一個優雅的解決方案。

import calendar

# 星期名稱列表
weekdays = list(calendar.day_name)
print(weekdays)  # 輸出: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

# 取得星期天的名稱
sunday = calendar.day_name[6]
print(sunday)  # 輸出: Sunday

# 計算 2025 年 3 月 30 日的星期幾
dow_index = calendar.weekday(2025, 3, 30)  # 取得星期索引
day_name = calendar.day_name[dow_index]
print(f"2025 年 3 月 30 日是:{day_name}") # 輸出: 2025 年 3 月 30 日是:Sunday

calendar.day_name 提供了一個預先定義好的星期名稱列表,索引從 0(星期一)到 6(星期日)。calendar.weekday() 函式則傳回指定日期的星期索引,結合兩者即可輕鬆取得星期名稱。

SAS 則使用 WEEKDAY 函式和 WEEKDATE 格式來完成同樣的任務。

data _null_;
  d = '30Mar2025'd;
  dow = weekday(d);
  day_name = put(d, weekdate9.);
  put '星期幾索引值: ' dow;
  put '星期幾名稱: ' day_name;
run;

日期調整與計算的時空穿梭

Python 的 replace() 方法允許我們像修改時間機器設定一樣調整日期。

from datetime import date, timedelta

d1 = date(2024, 1, 6)
d2 = d1 - timedelta(days=6)  # 計算6天前的日期

print(f"原始日期:{d1}") # 輸出:原始日期:2024-01-06
print(f"提前六天:{d2}") # 輸出:提前六天:2023-12-31


today = date.today()
future_date = date(2025, 12, 25)
days_diff = abs(future_date - today)

print(f"今天:{today}")
print(f"未來日期:{future_date}")
print(f"相差天數:{days_diff}")


d1 = date(2024, 1, 1)
ordinal = d1.toordinal()
shifted_date = date.fromordinal(ordinal + 1000)

print(f"原始日期:{d1}")
print(f"1000 天後的日期:{shifted_date}")

replace() 方法可以直接修改日期物件的年、月、日等屬性。計算日期差則可以直接使用減法運算,Python 的 timedelta 物件讓日期計算更加直觀。toordinal()fromordinal() 方法則提供了另一種日期計算的思路,將日期轉換為序數,方便進行加減運算。

SAS 的 INTNX 函式則像時間跳躍般調整日期。

data _null_;
  today = today();
  next_year = intnx('year', today, 1, 'sameday');
  put '明年今天:' next_year date9.;
run;
  graph LR
    A[Python 日期物件] --> B{replace()} --> C(調整日期)
    A --> D{- timedelta} --> E(計算日期差)
    F[SAS 日期值] --> G{INTNX()} --> H(調整日期)

Python 的日期時間格式轉換

Python 的 strftime() 方法如同格式轉換的魔杖,可以將日期時間物件轉換為各種格式的字串。

from datetime import date, time, datetime

nl = '\n'
dt = date(2019, 1, 24)

dt_str = dt.strftime('%d%B%Y')  # 格式化日期為 '24January2019'
dt_frm_str = datetime.strptime(dt_str, '%d%B%Y') # 將字串轉回日期時間物件

fmt = '%A, %B %dth, %Y' # 自定義格式
print(f"{nl}dt 物件: {dt}")
print(f"{nl}dt 資料型別: {type(dt)}")
print(f"{nl}dt_str 物件: {dt_str}")
print(f"{nl}dt_str 資料型別: {type(dt_str)}")
print(f"{nl}dt_frm_str 物件: {dt_frm_str}")
print(f"{nl}dt_frm_str 資料型別: {type(dt_frm_str)}")
print(f"{nl}顯示 dt_frm_str 為: {dt_frm_str.strftime(fmt)}")
print(f"{nl}使用格式指令: '{fmt}'")



d3 = date(2019, 12, 25)

dt_str3 = date.strftime(d3,'%y-%m-%d')
dt_str4 = date.strftime(d3,'%Y-%m-%d')
dt_str5 = date.strftime(d3,'%Y-%B-%d')

print(f"{nl}日期物件 d3: {d3}")
print(f"{nl}d3 資料型別: {type(d3)}")
print(f"{nl}dt_str3: {dt_str3}")
print(f"{nl}dt_str3 資料型別: {type(dt_str3)}")
print(f"{nl}dt_str4: {dt_str4}")
print(f"{nl}dt_str4 資料型別: {type(dt_str4)}")
print(f"{nl}dt_str5: {dt_str5}")
print(f"{nl}dt_str5 資料型別: {type(dt_str5)}")

strftime() 方法使用格式指令來控制輸出的字串格式,strptime() 方法則可以將格式化的字串解析回日期時間物件。

  graph LR
A[日期時間物件] -- strftime() --> B(格式化字串)
B -- strptime() --> A

日期和時間的處理在資料分析中至關重要。Python 和 SAS 提供了豐富的工具和函式,讓日期時間的魔法在程式碼中綻放。選擇哪種工具取決於您的具體需求和偏好。我建議您根據實際情況選擇最適合的方法。