Lab: Fix Broken Dates
คุณได้รับ CSV ที่ column วันที่มาจาก 2 ทีม — ทีมหนึ่งใช้ US format (MM/DD/YYYY) อีกทีมใช้ Thai format (DD/MM/YYYY) งานของคุณคือแก้ให้เป็น column เดียวที่ถูกต้อง
เวลาที่ใช้: ~25 นาที
ข้อมูลที่ได้รับ
Section titled “ข้อมูลที่ได้รับ”| name | join_date | source |
|---|---|---|
| Alice | 01/15/2025 | US-team |
| Bob | 20/03/2025 | TH-team |
| Carol | 03/04/2025 | US-team |
| Dave | 25/06/2025 | TH-team |
| Eve | 07/08/2025 | US-team |
| Frank | 14/02/2025 | TH-team |
สิ่งที่ต้องสังเกต:
- Alice:
01/15/2025→ เดือน 15 ไม่มี → ต้องเป็น MM/DD (January 15) - Bob:
20/03/2025→ วันที่ 20 เกิน 12 → ต้องเป็น DD/MM (March 20) - Carol:
03/04/2025→ กำกวม! อาจเป็น March 4 หรือ April 3 → ต้องดู source - Eve:
07/08/2025→ กำกวม! อาจเป็น July 8 หรือ August 7 → ต้องดู source
คำสั่ง
Section titled “คำสั่ง”-
วิเคราะห์ข้อมูล
ดูทีละ row: อันไหน parse ได้ทั้ง 2 แบบ (กำกวม)? อันไหน parse ได้แบบเดียว?
-
Google Sheets
สร้างข้อมูลใน A1:C7 แล้วสร้าง column D (clean_date) ที่ parse ตาม source:
- ถ้า source = “US-team” → parse เป็น MM/DD/YYYY
- ถ้า source = “TH-team” → parse เป็น DD/MM/YYYY
- Output เป็น format YYYY-MM-DD เสมอ
Hint: ใช้
IF(),MID(),LEFT(),RIGHT(),DATE()ผสมกัน -
Python (pandas)
import pandas as pddf = pd.DataFrame({"name": ["Alice", "Bob", "Carol", "Dave", "Eve", "Frank"],"join_date": ["01/15/2025", "20/03/2025", "03/04/2025","25/06/2025", "07/08/2025", "14/02/2025"],"source": ["US-team", "TH-team", "US-team","TH-team", "US-team", "TH-team"]})# เป้าหมาย: สร้าง column "clean_date" ที่ parse ถูกต้องตาม source# Hint: ใช้ .apply() หรือ mask + pd.to_datetime() -
SQL
CREATE TABLE raw_members (name VARCHAR(50),join_date VARCHAR(20),source VARCHAR(20));INSERT INTO raw_members VALUES ('Alice', '01/15/2025', 'US-team');INSERT INTO raw_members VALUES ('Bob', '20/03/2025', 'TH-team');INSERT INTO raw_members VALUES ('Carol', '03/04/2025', 'US-team');INSERT INTO raw_members VALUES ('Dave', '25/06/2025', 'TH-team');INSERT INTO raw_members VALUES ('Eve', '07/08/2025', 'US-team');INSERT INTO raw_members VALUES ('Frank', '14/02/2025', 'TH-team');-- เป้าหมาย: SELECT ที่ output clean_date เป็น DATE type ถูกต้อง-- Hint: ใช้ CASE + TO_DATE() -
ตรวจสอบ
ผลลัพธ์ที่ถูกต้องทั้ง 3 เครื่องมือ ต้องตรงกัน — ถ้าไม่ตรง แปลว่ามี row ที่ parse ผิด
ดูเฉลย — ผลลัพธ์ที่ถูกต้อง
| name | join_date (raw) | source | clean_date |
|---|---|---|---|
| Alice | 01/15/2025 | US-team | 2025-01-15 (January 15) |
| Bob | 20/03/2025 | TH-team | 2025-03-20 (March 20) |
| Carol | 03/04/2025 | US-team | 2025-03-04 (March 4) |
| Dave | 25/06/2025 | TH-team | 2025-06-25 (June 25) |
| Eve | 07/08/2025 | US-team | 2025-07-08 (July 8) |
| Frank | 14/02/2025 | TH-team | 2025-02-14 (February 14) |
Carol คือ row ที่สำคัญที่สุด: 03/04/2025 กำกวม แต่เพราะ source = US-team → parse เป็น MM/DD → March 4 (ไม่ใช่ April 3)
Eve ก็กำกวม: 07/08/2025 เพราะ source = US-team → parse เป็น MM/DD → July 8 (ไม่ใช่ August 7)
ดูเฉลย — Google Sheets
ใน cell D2 (แล้ว copy ลงไปทั้ง column):
=TEXT( IF(C2="US-team", DATE(RIGHT(B2,4), LEFT(B2,2), MID(B2,4,2)), DATE(RIGHT(B2,4), MID(B2,4,2), LEFT(B2,2)) ), "YYYY-MM-DD")อธิบาย:
LEFT(B2,2)= 2 ตัวแรก (ตำแหน่ง 1)MID(B2,4,2)= 2 ตัวกลาง (ตำแหน่ง 2)RIGHT(B2,4)= 4 ตัวท้าย (ปี)- ถ้า US → ตำแหน่ง 1 = เดือน, ตำแหน่ง 2 = วัน
- ถ้า TH → ตำแหน่ง 1 = วัน, ตำแหน่ง 2 = เดือน
ดูเฉลย — Python
import pandas as pd
df = pd.DataFrame({ "name": ["Alice", "Bob", "Carol", "Dave", "Eve", "Frank"], "join_date": ["01/15/2025", "20/03/2025", "03/04/2025", "25/06/2025", "07/08/2025", "14/02/2025"], "source": ["US-team", "TH-team", "US-team", "TH-team", "US-team", "TH-team"]})
# วิธี 1: ใช้ maskus_mask = df["source"] == "US-team"th_mask = df["source"] == "TH-team"
df.loc[us_mask, "clean_date"] = pd.to_datetime( df.loc[us_mask, "join_date"], format="%m/%d/%Y")df.loc[th_mask, "clean_date"] = pd.to_datetime( df.loc[th_mask, "join_date"], format="%d/%m/%Y")
print(df[["name", "join_date", "source", "clean_date"]])# name join_date source clean_date# 0 Alice 01/15/2025 US-team 2025-01-15# 1 Bob 20/03/2025 TH-team 2025-03-20# 2 Carol 03/04/2025 US-team 2025-03-04# 3 Dave 25/06/2025 TH-team 2025-06-25# 4 Eve 07/08/2025 US-team 2025-07-08# 5 Frank 14/02/2025 TH-team 2025-02-14
# วิธี 2: ใช้ applydef parse_date(row): fmt = "%m/%d/%Y" if row["source"] == "US-team" else "%d/%m/%Y" return pd.to_datetime(row["join_date"], format=fmt)
df["clean_date"] = df.apply(parse_date, axis=1)ดูเฉลย — SQL
SELECT name, join_date, source, CASE WHEN source = 'US-team' THEN TO_DATE(join_date, 'MM/DD/YYYY') ELSE TO_DATE(join_date, 'DD/MM/YYYY') END AS clean_dateFROM raw_members;
-- ผลลัพธ์:-- Alice | 01/15/2025 | US-team | 2025-01-15-- Bob | 20/03/2025 | TH-team | 2025-03-20-- Carol | 03/04/2025 | US-team | 2025-03-04-- Dave | 25/06/2025 | TH-team | 2025-06-25-- Eve | 07/08/2025 | US-team | 2025-07-08-- Frank | 14/02/2025 | TH-team | 2025-02-14