Validate Date Range
validate_date_range · dates · date, text
2026-09-23
กำลังประมวลผล…
validate_date_range · dates · date, text
2026-09-23
วันที่ที่เป็นไปไม่ได้เป็นสัญญาณของข้อมูลเสีย เช่น วันเกิดปี 1900 ที่มาจากค่าเริ่มต้นของระบบ หรือวันที่ทำรายการในอนาคตที่เกิดจากการพิมพ์ผิด เทคนิคนี้ตรวจว่าค่าอยู่ในช่วงที่สมเหตุสมผลหรือไม่ โดยค่าเริ่มต้นเพียงทำเครื่องหมายไว้ ไม่ลบให้เอง
filter_rows อธิบายเจตนาได้ตรงกว่าnormalize_date ก่อน ไม่อย่างนั้นทุกค่าจะถูกนับว่าไม่ผ่านmax ที่ระบุเฉพาะวันจะนับถึงสิ้นวันนั้น ดังนั้นเวลาบ่ายของวันขอบยังผ่าน ซึ่งตรงกับที่คนทั่วไปเข้าใจmin และ max เว้นว่างได้ ถ้าเว้นทั้งคู่ระบบจะเตือนว่าทุกค่าที่อ่านได้จะผ่านทั้งหมดaction กำหนดผล — flag เพิ่มคอลัมน์ผลตรวจ null ทำให้ค่าที่ไม่ผ่านเป็นค่าว่าง และ remove_row ลบทั้งแถว| Parameter | Type | Default |
|---|---|---|
column | string | — |
min | string | "" |
max | string | "" |
zone | string | "Asia/Bangkok" |
action | flag | null | remove_row | "flag" |
newColumnName | string | — |
import json
import re
from datetime import datetime, time
def parse_iso(value):
try:
return datetime.fromisoformat(value)
except (TypeError, ValueError):
return None
def validate_date_range(value, minimum='', maximum=''):
if value is None:
return None
moment = parse_iso(str(value).strip())
if moment is None:
return False
low = parse_iso(minimum) if minimum else None
high = parse_iso(maximum) if maximum else None
if high is not None and re.fullmatch(r'\d{4}-\d{2}-\d{2}', maximum):
high = datetime.combine(high.date(), time.max)
if low is not None and moment < low:
return False
return not (high is not None and moment > high)
values = ['2026-09-23T18:30:00', '2026-09-23', '2025-12-31', 'ไม่ใช่วันที่', None]
print(json.dumps([validate_date_range(v, '2026-01-01', '2026-09-23') for v in values], ensure_ascii=False))
คอลัมน์ birth_date ควรอยู่ระหว่างปี 1920 ถึงวันนี้ ตั้ง min เป็น 1920-01-01 และ max เป็นวันที่ปัจจุบัน ใช้ action แบบ flag แล้วกรองดูเฉพาะแถวที่ไม่ผ่าน ถ้าพบวันที่ 1900-01-01 จำนวนมาก แปลว่าระบบต้นทางใส่ค่าเริ่มต้นแทนค่าว่าง ควรเปลี่ยนเป็น null ด้วย find_replace หรือ detect_null_like แทนการลบแถว
ใช้ normalize_date ก่อนเพื่อให้ทุกค่าอ่านได้ ใช้ filter_rows เมื่อจะตัดแถวออกจริง และใช้ flag_missing เพื่อแยกแถวที่ไม่มีวันที่ตั้งแต่ต้น