1. 在使用 Python 處理日期和字串之前應了解的基礎知識
在 Python 中處理日期或時間時,最基本的便是「datetime
模組」。本文將詳細說明日期與字串的相互轉換方法,但在那之前,先來整理一下應了解的基本概念與類別吧。Python 的標準函式庫 datetime
是什麼?
Python 提供了 datetime
模組作為處理日期與時間的標準函式庫。其特點是不需要額外安裝,即可立即使用。透過此模組,可以進行取得目前時刻、日期的加減、格式轉換、比較等廣泛的操作。 首先,讓我們確認基本的匯入方法。import datetime
或者,也可以像下面這樣只匯入必要的類別。from datetime import datetime, date, time, timedelta
常用類別及其差異
datetime
模組中存在多個類別,但與日期和字串轉換關係最密切的主要是以下三個。datetime.date 類別
表示「年・月・日」資訊的類別。不包含時間。d = datetime.date(2025, 4, 7)
print(d) # 輸出: 2025-04-07
datetime.time 類別
僅持有「時・分・秒」等時間相關資訊的類別。不包含日期。t = datetime.time(14, 30, 0)
print(t) # 輸出: 14:30:00
datetime.datetime 類別
能夠處理日期(年・月・日)和時間(時・分・秒)的、最通用的類別。dt = datetime.datetime(2025, 4, 7, 14, 30)
print(dt) # 輸出: 2025-04-07 14:30:00
此類別在字串與日期的相互轉換中最常被使用。使用 datetime.now() 取得目前日期時間
使用 datetime.datetime
類別 的 now()
方法,即可輕鬆取得目前的日期時間。from datetime import datetime
now = datetime.now()
print(now) # 範例: 2025-04-07 13:45:12.345678
像這樣取得的 datetime
物件,可以使用稍後介紹的 strftime()
或 strptime()
來轉換成字串,或從字串生成。總結
本節中,說明了在 Python 處理日期與時間時最基本的 datetime
模組的概要,以及代表性類別的差異。下一節將聚焦於「從字串轉換到日期」,介紹 strptime()
的具體用法。
2. 【字串 → 日期】使用strptime()
建立日期物件的方法
在 Python 中,為了將表示日期的字串轉換為datetime
物件,我們使用名為strptime()
的方法。這是「string parse time」的縮寫,是一種解析字串並使其被識別為日期的函式。 本章將依序說明從基本用法、對應中文表示法的方法,到錯誤的處理方式。strptime()
的基本用法與格式指定子一覽
基本構文
from datetime import datetime
date_string = '2025-04-07'
dt = datetime.strptime(date_string, '%Y-%m-%d')
print(dt) # 輸出: 2025-04-07 00:00:00
strptime()
會接受以下兩種引數:- 第一引數:解析對象的字串(例: ‘2025-04-07’)
- 第二引數:該字串的格式(例: ‘%Y-%m-%d’)
常用格式指定子
指定子 | 意義 | 範例 |
---|
%Y | 西元年(4 位) | 2025 |
%y | 西元年(2 位) | 25 |
%m | 月(2 位) | 04 |
%d | 日(2 位) | 07 |
%H | 小時(24 小時制) | 14 |
%M | 分鐘 | 30 |
%S | 秒 | 59 |
%A | 星期(英文) | Monday |
%p | 上午/下午(AM/PM) | AM |
另一個範例:包含日期時間的轉換
date_string = '2025-04-07 14:30:00'
dt = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
print(dt) # 輸出: 2025-04-07 14:30:00
如何處理中文表示的日期字串?
在中文中常見的「2025年4月7日」或「2025年04月07日(一)」等格式的處理,需要像以下這樣巧妙設計格式。解析包含年月日中文的字串範例
date_string = '2025年4月7日'
dt = datetime.strptime(date_string, '%Y年%m月%d日')
print(dt) # 輸出: 2025-04-07 00:00:00
包含中文星期的字串,基本的strptime()
無法對應
例如「2025年4月7日(一)」這樣的字串,單獨使用strptime()
會發生錯誤。這是因為 Python 的strptime()
依賴地區設定,且中文的星期標準上不支援。 在這種情況下,有以下的對應方法:- 從字串中移除不需要的中文星期部分後,再傳給
strptime()
- 活用外部程式庫(例:
kanji_to_time
等)
常見錯誤及其處理方法:ValueError
使用strptime()
時最常遇到的,是以下這樣的錯誤。ValueError: time data '2025/04/07' does not match format '%Y-%m-%d'
此錯誤的原因是?
這是因為字串的實際形式與指定的格式不一致而發生的。 例如,如果要處理 '2025/04/07'
這樣的日期,則需要像下面這樣,將格式也調整為斜線。date_string = '2025/04/07'
dt = datetime.strptime(date_string, '%Y/%m/%d')
疑難排解的要點
- 確認分隔符號(-、/、空白等)
- 是否補零(例: ’04’ vs ‘4’)
- 是否包含星期等、
strptime()
無法處理的多餘資訊
3. 【日期 → 字串】使用strftime()
自由格式轉換的方法
在 Python 中處理日期時,將 datetime
物件轉換為特定格式的字串的情況非常多。此時方便的就是 strftime()
方法。 本章將說明 strftime()
的基本用法、常用格式指定子,以及顯示中文的星期名稱的方法。strftime()
的基本用法
語法與簡單使用範例
from datetime import datetime
dt = datetime(2025, 4, 7, 14, 30)
formatted = dt.strftime('%Y-%m-%d %H:%M:%S')
print(formatted) # 輸出: 2025-04-07 14:30:00
strftime()
是「string format time」的縮寫,將 datetime
物件轉換為指定的格式字串。常用格式指定子(重列)
格式碼 | 含義 | 範例 |
---|
%Y | 西元(4位) | 2025 |
%m | 月份(2位) | 04 |
%d | 日期(2位) | 07 |
%H | 小時(24小時制) | 14 |
%M | 分鐘 | 30 |
%S | 秒 | 00 |
%A | 星期(英文) | Monday |
%a | 星期(縮寫) | Mon |
%p | 上午/下午(AM/PM) | PM |
實用範例:自由自訂格式
以斜線分隔顯示年月日
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y/%m/%d')
print(formatted) # 輸出: 2025/04/07
轉換為年月日格式
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y年%m月%d日')
print(formatted) # 輸出: 2025年04月07日
包含時間的詳細顯示
dt = datetime(2025, 4, 7, 14, 30)
formatted = dt.strftime('%Y年%m月%d日 %H時%M分')
print(formatted) # 輸出: 2025年04月07日 14時30分
想要顯示中文的星期名稱時
strftime('%A')
可以顯示星期,但預設是英文表示。如果想要顯示中文,則需要變更地區設定(語言設定)。使用 locale 模組的範例(適用於 UNIX/Linux 環境)
import locale
from datetime import datetime
locale.setlocale(locale.LC_TIME, 'zh_TW.UTF-8')
dt = datetime(2025, 4, 7)
formatted = dt.strftime('%Y年%m月%d日(%A)')
print(formatted) # 輸出: 2025年04月07日(星期一)
注意事項
- Windows 環境中
'zh_TW.UTF-8'
可能無法使用。 - 由於依賴環境,在 Web 應用程式或散布程式碼中應避免硬編碼。
- 如果重視穩定性,也可以自己使用字典映射星期名稱。
weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
weekday = weekdays[dt.weekday()]
print(f"{dt.strftime('%Y年%m月%d日')}({weekday})")
總結
本章介紹了將 datetime
物件轉換為字串的方法,即 strftime()
的用法與實際範例。能夠自由自訂輸出格式的特性,在日期資料的可視化或記錄輸出等各種場合都非常有用。 下一章將說明與標準化日期格式「ISO 8601 格式」的相互轉換。
4. ISO 8601格式的互換轉換技巧
在系統間資料聯動或API通訊等情況下,以「ISO 8601格式」交換日期時間是很常見的。Python中,此格式的轉換也是非常重要的操作之一。 本章將說明Python中ISO 8601格式的互換轉換方法,以及處理含時區資訊的字串方式。ISO 8601格式是什麼?
ISO 8601格式是「國際標準化組織(ISO)」所制定的日期與時間表示規則。其形式如下所示:2025-04-07T14:30:00
- 日期與時間之間夾以 “T”
- 24小時表示法
- 有時會附加時區資訊(例如:
+09:00
或 Z
)
此格式廣泛用於JSON或XML等資料格式、REST API、記錄檔等。isoformat()
將日期 → 轉換為ISO格式的字串
Python的datetime
物件中,備有isoformat()
這種便利的方法。使用範例
from datetime import datetime
dt = datetime(2025, 4, 7, 14, 30)
iso_str = dt.isoformat()
print(iso_str) # 輸出: 2025-04-07T14:30:00
可透過引數微調
# 顯示到毫秒
print(dt.isoformat(timespec='milliseconds')) # 2025-04-07T14:30:00.000
# 只取得日期
print(dt.date().isoformat()) # 2025-04-07
fromisoformat()
將ISO格式 → 轉換為datetime物件
相反地,要從ISO 8601格式的字串產生datetime
物件,則使用fromisoformat()
。使用範例
iso_str = '2025-04-07T14:30:00'
dt = datetime.fromisoformat(iso_str)
print(dt) # 輸出: 2025-04-07 14:30:00
這非常直觀,且Python 3.7以降即支援。對應含時區資訊的ISO字串的方法
標準的fromisoformat()
在包含時區資訊(例如:+09:00
或Z
)時,有時無法順利處理。此類情況下,使用第三方程式庫可更靈活地應對。推薦程式庫:dateutil.parser
pip install python-dateutil
使用範例
from dateutil import parser
iso_str = '2025-04-07T14:30:00+09:00'
dt = parser.parse(iso_str)
print(dt) # 輸出: 2025-04-07 14:30:00+09:00
如此,即可正確解析含時區的ISO字串。補充:UTC與Z表示法的差異
Z
是「Zulu Time(UTC)」的縮寫。2025-04-07T14:30:00Z
表示UTC(協定世界時)的時間。
Python標準的fromisoformat()
不支援Z
表示法,因此仍推薦使用dateutil.parser
。總結
ISO 8601格式是日期與時間資料交換中不可或缺的存在。Python中,可使用isoformat()
與fromisoformat()
輕鬆進行轉換,但處理含時區的字串時,使用外部程式庫dateutil
非常有效。 下一章將介紹日期的計算、比較、差分求取等,在實務中實用的進階技巧。5. 處理日期時知道這些技巧會很方便的技巧集
在處理日期或時間時,不僅僅是轉換格式,日期之間的比較或日期的加減等處理也很常用。 本章將以datetime
模組中實務上實用的技巧為中心進行說明。timedelta
用來加減日期
如果想計算日期的「1天後」「1週前」「30天後」等,可以使用datetime.timedelta
類別。求取1天後・1天前的日期
from datetime import datetime, timedelta
today = datetime(2025, 4, 7)
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)
print(tomorrow) # 輸出: 2025-04-08 00:00:00
print(yesterday) # 輸出: 2025-04-06 00:00:00
也可以以時間單位進行加減
dt = datetime(2025, 4, 7, 14, 30)
plus_2_hours = dt + timedelta(hours=2)
print(plus_2_hours) # 輸出: 2025-04-07 16:30:00
取得今天・昨天・明天的日期
以現在時間為基礎,取得相對日期的模式也非常常見。from datetime import datetime, timedelta
now = datetime.now()
today = now.date()
yesterday = today - timedelta(days=1)
tomorrow = today + timedelta(days=1)
print(f"今天: {today}")
print(f"昨天: {yesterday}")
print(f"明天: {tomorrow}")
藉此,就可以輕鬆實作日報或排程器等功能。日期的比較與差分(天數)的計算
也可以計算兩個日期的前後關係,或差分(天數・時間等)。日期的比較(大小關係)
d1 = datetime(2025, 4, 7)
d2 = datetime(2025, 4, 10)
print(d1 < d2) # 輸出: True
求取差分(timedelta的活用)
delta = d2 - d1
print(delta.days) # 輸出: 3
如此一來,差分會以timedelta
物件的形式取得,可以透過其中的.days
或.seconds
屬性來細部分別取得。取得・判斷特定曜日的辦法
要從日期取得星期,或判斷是否為特定星期,可以使用.weekday()
或.isoweekday()
。方法 | 輸出(例:星期一) |
---|
.weekday() | 0(=星期一) |
.isoweekday() | 1(=星期一) |
d = datetime(2025, 4, 7) # 星期一
print(d.weekday()) # 輸出: 0
print(d.isoweekday()) # 輸出: 1
以日文顯示星期的方法(使用字典映射)
weekdays = ['月', '火', '水', '木', '金', '土', '日']
weekday_jp = weekdays[d.weekday()]
print(f"{d.strftime('%Y/%m/%d')}({weekday_jp})")
閏年的判斷・月末的自動計算(補充)
import calendar
# 判斷是否為閏年
print(calendar.isleap(2024)) # 輸出: True
# 取得月末的日期
last_day = calendar.monthrange(2025, 4)[1]
print(last_day) # 輸出: 30
總結
本章介紹了實務上常見的日期加減、比較、差分的計算方法,以及曜日的判斷等。特別是活用timedelta
的處理,具有非常高的通用性,是日期處理的基礎技能,值得牢記。 下一章將彙整與至今說明內容相關的常見問題(FAQ),提供有助於解答疑問的資訊。
6. 常見問題(FAQ)
在 Python 中處理日期與字串時,特別是初學者容易碰到的難點,我們以常見問題的形式彙整。請用來解決疑難或強化理解。Q1. strptime()
為什麼會出現 ValueError
?
A. 很可能格式不匹配。
strptime()
中,字串與指定的格式即使只差一個字元也會出錯。 範例:NG 的情況from datetime import datetime
date_string = '2025/04/07'
# 格式設定為「-」而導致不匹配
dt = datetime.strptime(date_string, '%Y-%m-%d')
# → ValueError 發生
修正範例:dt = datetime.strptime(date_string, '%Y/%m/%d')
另外,還可能有以下原因:- 是否有零填充(例如 04 和 4)
- 多餘的字元(例如:星期或空格)
- 不支援的格式(日文的「上午・下午」等)
Q2. 為什麼不會顯示日文的星期,而是顯示英文?
A. strftime('%A')
依賴於地區設定(語言設定)。
Python 的標準設定使用英文,因此 %A
取得的星期會是 Monday
等。解決方案1:使用 locale
模組(UNIX/Linux 系統)
import locale
from datetime import datetime
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
dt = datetime(2025, 4, 7)
print(dt.strftime('%A')) # 輸出: 星期一
解決方案2:使用字典將星期對應到日文(不依賴環境)
weekdays = ['月', '火', '水', '木', '金', '土', '日']
print(weekdays[dt.weekday()]) # 輸出: 月
Q3. 可以轉換包含「上午」「下午」的日文日期嗎?
A. Python 標準的 strptime()
不支援。
例如 '2025年4月7日 下午2時30分'
這類字串,在標準的 strptime()
中會出錯。對應方法:
- 自行使用正規表達式等將「上午/下午」轉換為時間
- 使用外部函式庫(例如:
dateparser
)
pip install dateparser
import dateparser
s = '2025年4月7日 下午2時30分'
dt = dateparser.parse(s)
print(dt) # 輸出: 2025-04-07 14:30:00
Q4. datetime.now()
和 datetime.today()
的差別是什麼?
A. 實質上相同(在 datetime.datetime
中)。
from datetime import datetime
print(datetime.now()) # 取得目前的日期時間
print(datetime.today()) # 同樣取得目前的日期時間
兩者都返回目前的本地時間。嚴格的差別在 Python 文件中有記載,但在一般用途中視為相同行為沒有問題。Q5. 無法轉換帶有時區的 ISO 字串。該怎麼辦?
A. datetime.fromisoformat()
不支援某些帶有時區的字串。
例如:2025-04-07T14:30:00+09:00
等解決方案:使用 dateutil.parser.parse()
from dateutil import parser
s = '2025-04-07T14:30:00+09:00'
dt = parser.parse(s)
print(dt) # 輸出: 2025-04-07 14:30:00+09:00
使用 dateutil
函式庫,即可靈活處理帶有時區的字串。補充:如果在 Windows 上日文地區設定無法正常運作?
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
無法通過時,Windows 的地區設定名稱會是 Japanese_Japan.932
之類。locale.setlocale(locale.LC_TIME, 'Japanese_Japan.932')
不過,由於環境差異,使用字典對應更為可靠。總結
在 FAQ 中,我們以具體範例說明了常見錯誤和容易混淆的點。如果能解決這些疑問,應該能對 Python 中的日期與字串處理更有自信。