1.1 One Dataset, Three Tools
ลองนึกว่าคุณมีไฟล์ CSV ไฟล์เดียว เปิดใน Sheets เห็นแบบหนึ่ง เปิดใน Python เห็นอีกแบบ query ใน SQL เห็นอีกแบบ — ข้อมูลเดียวกัน แต่ “เรื่อง” ที่เครื่องมือเล่าให้คุณฟังต่างกัน
ตัวอย่างข้อมูล
Section titled “ตัวอย่างข้อมูล”สมมติเรามีตารางนักเรียน 1 แถว:
| student_id | name | price | enrolled_on | active |
|---|---|---|---|---|
| 00123 | Ploy | 199.00 | 2026-04-24 | TRUE |
ดูเรียบง่ายใช่ไหม? แต่แต่ละเครื่องมือจะตีความคอลัมน์เหล่านี้ต่างกัน
เปิด Google Sheets ใหม่ แล้วพิมพ์ข้อมูลนี้ตามคอลัมน์:
| A (student_id) | B (name) | C (price) | D (enrolled_on) | E (active) |
|---|---|---|---|---|
| 00123 | Ploy | 199.00 | 2026-04-24 | TRUE |
สังเกต:
00123→ Sheets อาจเปลี่ยนเป็น123ทันที! (leading zeros หายไป)199.00→ อาจแสดงเป็น199(ตัด.00ทิ้ง)2026-04-24→ อาจเปลี่ยนเป็นApr 24, 2026(auto-format เป็นวันที่)TRUE→ แสดงเป็น checkbox หรือข้อความ ขึ้นอยู่กับ format
Sheets พยายาม “ช่วย” คุณ — แต่บางทีมันช่วยผิดทาง
ลองตรวจสอบ: ใช้ =ISNUMBER(A2) กับ =ISTEXT(A2) เพื่อดูว่า Sheets ตีความ cell เป็นอะไร
ใน C คุณต้องประกาศ type ให้ทุก field ตั้งแต่ต้น:
#include <stdio.h>#include <stdbool.h>
struct Student { char student_id[6]; // "00123" + null terminator char name[50]; double price; char enrolled_on[11]; // "2026-04-24" + null bool active;};
int main() { struct Student s = {"00123", "Ploy", 199.00, "2026-04-24", true};
printf("ID: %s\n", s.student_id); // 00123 (text!) printf("Name: %s\n", s.name); // Ploy printf("Price: %.2f\n", s.price); // 199.00 printf("Date: %s\n", s.enrolled_on); // 2026-04-24 (แค่ text) printf("Active: %d\n", s.active); // 1 (true) return 0;}สังเกต:
student_idเป็นchar[]ไม่ใช่int→ leading zeros อยู่ครบenrolled_onเป็นแค่ text — C ไม่มี date type ในตัวactiveเป็นboolแต่ print ออกมาเป็น1
import pandas as pd
data = { 'student_id': ['00123'], 'name': ['Ploy'], 'price': [199.00], 'enrolled_on': ['2026-04-24'], 'active': [True]}df = pd.DataFrame(data)print(df)print(df.dtypes)ผลลัพธ์ df.dtypes:
student_id object ← string (ถ้าสร้างถูก)name object ← stringprice float64 ← ตัวเลขทศนิยมenrolled_on object ← string (ยังไม่ใช่ datetime!)active bool ← booleanสังเกต:
- pandas เรียก text ว่า
object(ชื่อแปลก แต่หมายถึง string) enrolled_onเป็นแค่ text ยังไม่ใช่ datetime — ต้อง convert เอง- ถ้าอ่านจาก CSV โดยไม่ระบุ dtype,
student_idอาจกลายเป็นint64→ leading zeros หาย!
ลอง:
df_csv = pd.read_csv('students.csv') # 00123 → 123 (!)df_safe = pd.read_csv('students.csv', dtype={'student_id': str}) # 00123 อยู่ครบCREATE TABLE students ( student_id VARCHAR(10), name VARCHAR(50), price DECIMAL(10,2), enrolled_on DATE, active BOOLEAN);
INSERT INTO studentsVALUES ('00123', 'Ploy', 199.00, '2026-04-24', TRUE);
SELECT * FROM students;ผลลัพธ์:
student_id | name | price | enrolled_on | active00123 | Ploy | 199.00 | 2026-04-24 | tสังเกต:
student_idเป็นVARCHAR→ leading zeros อยู่ครบpriceเป็นDECIMAL(10,2)→ บังคับ 2 ตำแหน่งทศนิยมเสมอenrolled_onเป็นDATEจริงๆ — ไม่ใช่แค่ textactiveแสดงเป็นt(true) ใน PostgreSQL
ถ้าเปลี่ยน student_id เป็น INTEGER:
-- อย่าทำ!student_id INTEGER -- 00123 → 123 (leading zeros หาย)เปรียบเทียบ
Section titled “เปรียบเทียบ”| คอลัมน์ | Sheets (auto) | C | Python (pandas) | SQL |
|---|---|---|---|---|
| student_id | 123 (เปลี่ยน!) | “00123” (char[]) | “00123” หรือ 123 (ขึ้นกับ dtype) | ‘00123’ (VARCHAR) |
| price | 199 | 199.000000 (double) | 199.0 (float64) | 199.00 (DECIMAL) |
| enrolled_on | Apr 24, 2026 | ”2026-04-24” (text) | “2026-04-24” (object) | 2026-04-24 (DATE) |
| active | TRUE / checkbox | 1 (int) | True (bool) | t (boolean) |