🧠【完整教學】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

👉 這種工具幾乎是必備的。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)