Skip to content

Lab: Fix Broken Dates

คุณได้รับ CSV ที่ column วันที่มาจาก 2 ทีม — ทีมหนึ่งใช้ US format (MM/DD/YYYY) อีกทีมใช้ Thai format (DD/MM/YYYY) งานของคุณคือแก้ให้เป็น column เดียวที่ถูกต้อง

เวลาที่ใช้: ~25 นาที

ข้อมูลที่ได้รับ

Section titled “ข้อมูลที่ได้รับ”
namejoin_datesource
Alice01/15/2025US-team
Bob20/03/2025TH-team
Carol03/04/2025US-team
Dave25/06/2025TH-team
Eve07/08/2025US-team
Frank14/02/2025TH-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
  1. วิเคราะห์ข้อมูล

    ดูทีละ row: อันไหน parse ได้ทั้ง 2 แบบ (กำกวม)? อันไหน parse ได้แบบเดียว?

  2. 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() ผสมกัน

  3. Python (pandas)

    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"]
    })
    # เป้าหมาย: สร้าง column "clean_date" ที่ parse ถูกต้องตาม source
    # Hint: ใช้ .apply() หรือ mask + pd.to_datetime()
  4. 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()
  5. ตรวจสอบ

    ผลลัพธ์ที่ถูกต้องทั้ง 3 เครื่องมือ ต้องตรงกัน — ถ้าไม่ตรง แปลว่ามี row ที่ parse ผิด

ดูเฉลย — ผลลัพธ์ที่ถูกต้อง
namejoin_date (raw)sourceclean_date
Alice01/15/2025US-team2025-01-15 (January 15)
Bob20/03/2025TH-team2025-03-20 (March 20)
Carol03/04/2025US-team2025-03-04 (March 4)
Dave25/06/2025TH-team2025-06-25 (June 25)
Eve07/08/2025US-team2025-07-08 (July 8)
Frank14/02/2025TH-team2025-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: ใช้ mask
us_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: ใช้ apply
def 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_date
FROM 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