Detect Type
detect_type · types · any
2026-09-23
กำลังประมวลผล…
detect_type · types · any
2026-09-23
เมื่อไฟล์มีสิบกว่าคอลัมน์ การไล่เลือกชนิดทีละคอลัมน์ช้าและพลาดง่าย เทคนิคนี้อ่านตัวอย่างข้อมูลแล้วสรุปให้ว่าคอลัมน์ไหนน่าจะเป็นตัวเลข วันที่ หรือ boolean แล้วแปลงให้ในขั้นตอนเดียว โดยยังต้องกดเพิ่มเข้า Pipeline เองเสมอ
convert_type ตรงกว่าและอ่านง่ายกว่าใน Pipeline01000 กลายเป็น 1000 อย่างถาวรinteger ถ้ามีทศนิยมปนได้ decimal| Parameter | Type | Default |
|---|---|---|
columns | string[] | — |
import json
import re
THRESHOLD = 0.95
TRUE_TOKENS = {'true', 'yes', 'y', '1', 'ใช่', 'จริง', 't'}
FALSE_TOKENS = {'false', 'no', 'n', '0', 'ไม่ใช่', 'เท็จ', 'f'}
NULL_TOKENS = {'', '-', 'n/a', 'na', 'null', 'none', 'unknown', '?', 'ไม่ระบุ'}
def infer_kind(values):
sample = [v for v in values if v is not None and str(v).strip().lower() not in NULL_TOKENS]
if not sample:
return 'unknown'
texts = [str(v).strip() for v in sample]
booleans = sum(1 for t in texts if t.lower() in TRUE_TOKENS | FALSE_TOKENS)
if booleans / len(texts) >= THRESHOLD:
return 'boolean'
numbers = [t for t in texts if re.fullmatch(r'[+-]?(\d+\.?\d*|\.\d+)', t.replace(',', ''))]
if len(numbers) / len(texts) >= THRESHOLD:
if any(re.fullmatch(r'0\d+', t) for t in numbers):
return 'text'
return 'integer' if all('.' not in t for t in numbers) else 'decimal'
if sum(1 for t in texts if re.fullmatch(r'\d{4}-\d{2}-\d{2}', t)) / len(texts) >= THRESHOLD:
return 'date'
return 'text'
columns = {
'amount': ['1,200', '980', '75'],
'zipcode': ['01000', '10240', '50200'],
'active': ['yes', 'no', 'ใช่'],
'joined': ['2026-01-05', '2026-02-11', None],
'note': ['ดี', 'พอใช้', '3'],
}
print(json.dumps({name: infer_kind(values) for name, values in columns.items()}, ensure_ascii=False))
เปิดไฟล์ขายของ 11 คอลัมน์ที่เป็น text ทั้งหมด รัน detect_type แล้วอ่านคำเตือนใน Preview ว่าคอลัมน์ไหนมีค่าที่แปลงไม่ได้กี่ค่า ถ้าคอลัมน์ zipcode ยังเป็น text แปลว่าระบบเจอศูนย์นำหน้าและตั้งใจไม่แปลงให้ — นั่นคือพฤติกรรมที่ถูกต้อง
ใช้ convert_type เมื่อรู้ชนิดที่ต้องการแน่นอนแล้ว ใช้ normalize_date สำหรับคอลัมน์วันที่ที่มีหลายรูปแบบ และใช้ pad_or_strip_zeros เมื่อศูนย์นำหน้าหายไปตั้งแต่ไฟล์ต้นทาง