在資料科學的領域中,時間是不可或缺的元素。精確處理日期和時間資料,是每位資料分析師的必修課。本文將深入比較 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_value
。vtype()
函式用於顯示變數的資料型別。
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 提供了豐富的工具和函式,讓日期時間的魔法在程式碼中綻放。選擇哪種工具取決於您的具體需求和偏好。我建議您根據實際情況選擇最適合的方法。