🧠【完整教學】Python 日期格式自動辨識:一次搞懂多種時間格式轉換(新手也看得懂)
📌 前言:為什麼「日期格式」會讓工程師崩潰?
你可能遇過這種情況:
-
Excel 匯出 →
01/28/2026 14:35:20 -
資料庫 →
2026-01-28 14:35:20 -
舊系統 →
20260128143520 -
API 回傳 →
2026/1/28 14:35
👉 看起來都是時間,但格式完全不同!
如果你沒有處理好,就會出現:
- ❌ 程式直接報錯
- ❌ 資料轉換失敗
- ❌ 報表時間錯亂
🎯 本篇重點:打造「萬用日期解析器」
我們要做的是:
👉 寫一段程式,自動判斷日期格式並轉成 Python 的 datetime
🧩 核心概念(白話版)
整個邏輯其實很簡單:
1️⃣ 先檢查是不是空值
2️⃣ 判斷符合哪一種日期格式
3️⃣ 用對應方式轉換
4️⃣ 成功就回傳
🧪 完整範例
import re
from datetime import datetime
def convert_to_datetime(text):
# Step 1:處理空值
if text is None:
return None
text = str(text).strip()
if text == "" or text.lower() == "nan":
return None
# Step 2:定義格式清單(規則 + 轉換格式)
rules = [
(r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$', '%Y-%m-%d %H:%M:%S'),
(r'^\d{4}/\d{2}/\d{2} \d{2}:\d{2}$', '%Y/%m/%d %H:%M'),
(r'^\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}$', '%m/%d/%Y %H:%M:%S'),
(r'^\d{14}$', '%Y%m%d%H%M%S'),
(r'^\d{8}$', '%Y%m%d')
]
# Step 3:逐一比對
for pattern, fmt in rules:
if re.match(pattern, text):
return datetime.strptime(text, fmt)
# Step 4:都不符合
return None
🔍 一步一步解釋(新手版)
🧱 Step 1:先擋掉「垃圾資料」
if text is None:
return None
👉 避免:
- 空值
- NaN
- 空字串
這一步非常關鍵,不然後面會直接爆錯。
🧱 Step 2:定義「日期規則表」
rules = [
(regex, 格式),
]
這邊就像在建立一張對照表:
| 資料長怎樣 | 怎麼解析 |
|---|---|
| 2026-01-28 14:35:20 |
%Y-%m-%d %H:%M:%S
|
| 2026/01/28 14:35 |
%Y/%m/%d %H:%M
|
| 01/28/2026 14:35:20 |
%m/%d/%Y %H:%M:%S
|
| 20260128143520 |
%Y%m%d%H%M%S
|
🧱 Step 3:用「正則表達式」判斷格式
if re.match(pattern, text):
👉 白話:
「這個字串長得像不像某種日期格式?」
例如:
20260128 → 8碼數字 → 是日期
🧱 Step 4:轉換成 datetime
datetime.strptime(text, fmt)
👉 功能:
把「字串」變成「時間物件」
🧱 Step 5:都不符合就回傳 None
return None
👉 代表:
- 格式不支援
- 資料有問題
📊 實際測試結果
print(convert_to_datetime("2026-01-28 14:35:20"))
👉 輸出:
2026-01-28 14:35:20
print(convert_to_datetime("20260128"))
👉 輸出:
2026-01-28 00:00:00
print(convert_to_datetime("abc"))
👉 輸出:
None
💡 為什麼這種寫法很重要?
在實務中(你應該很有感):
🏭 常見場景
- Spotfire 資料分析
- ETL 批次處理
- Excel 匯入
- 多系統整合(銀行 / 半導體)
👉 每個來源的日期格式都不同
🚀 這種寫法的優點
✅ 不會直接噴錯
✅ 可支援多格式
✅ 易擴充(只要加一條 rule)
✅ 適合大數據清洗
⚠️ 常見錯誤(工程師踩坑區)
❌ 1. 直接用 strptime
👉 格式不對會直接 crash
❌ 2. 忘記處理空值
👉 None.strip() 直接爆炸
❌ 3. 格式寫死
👉 無法支援多來源資料
✨ 進階優化(工程師進階)
如果你之後要優化,可以考慮:
-
🔁 加
try/except保護 - ⚡ 用 dict + cache 提升效能
- 📦 改成 class 管理解析規則
- 🧪 加 logging 記錄異常資料
🧾 結論
👉 這段程式的本質就是:
建立一個「萬用日期翻譯器」,讓不同格式都能統一轉成標準時間
如果你在做:
- 報表系統(像 AMD70 / AMD72)
- DB2 / Oracle 資料轉換
- Spotfire ETL
👉 這種工具幾乎是必備的。
留言
張貼留言