Thep Excel

pandas to_datetimeแปลง string วันที่ให้เป็น datetime จริงๆ

pd.to_datetime() ใช้แปลงข้อมูลวันที่ที่อยู่ในรูป string หรือตัวเลขให้กลายเป็น datetime ที่ pandas จัดการได้ครับ พอแปลงแล้วก็เรียงลำดับ คำนวณระยะเวลา และดึงเดือน-ปี-วันออกมาได้ทันที

>_
pd.to_datetime(arg, format, errors, dayfirst, yearfirst, utc, unit, origin, cache)

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าSeries

เมื่อส่ง Series เข้าไปจะได้ Series ที่มี dtype datetime64 กลับมาครับ จากนั้นต่อด้วย .dt.year / .dt.month / .dt.day หรือใช้ใน sort_values ได้ทันที

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
arg str | list | Series | DataFrame ข้อมูลที่ต้องการแปลง อาจเป็น string เดี่ยว, list, หรือ Series ของ string วันที่ก็ได้ครับ
[format]ไม่บังคับ str None รูปแบบ strftime ที่บอกว่า string นั้นหน้าตาเป็นยังไง เช่น ‘%d/%m/%Y’ หรือ ‘%Y%m%d’ ถ้าไม่ใส่ pandas จะ infer เองครับ
[errors]ไม่บังคับ str 'raise' ถ้าแปลงไม่ได้จะทำยังไง: ‘raise’ = ขึ้น error, ‘coerce’ = ใส่ NaT แทน ผมชอบ ‘coerce’ สำหรับข้อมูลสกปรกครับ
[dayfirst]ไม่บังคับ bool False ถ้า True ให้ parse วันเป็นตัวแรก เช่น ’10/11/2024′ = 10 พฤศจิกา ไม่ใช่ 11 ตุลา ใช้กับรูปแบบยุโรป/ไทยครับ
[yearfirst]ไม่บังคับ bool False ถ้า True ให้ parse ปีเป็นตัวแรก ใช้กับรูปแบบ ISO เช่น ‘2024-12-31’ (ปกติ pandas ก็ infer ได้เองแต่ระบุชัดกว่าครับ)
[utc]ไม่บังคับ bool False ถ้า True จะ normalize ทุก datetime ให้เป็น UTC เหมาะกับข้อมูลที่มีหลาย timezone ผสมกันครับ
[unit]ไม่บังคับ str None หน่วยของ arg เมื่อเป็นตัวเลข เช่น ‘s’ = วินาที, ‘ms’ = millisecond, ‘D’ = วัน นับจาก origin
[origin]ไม่บังคับ str | Timestamp 'unix' จุดเริ่มต้นสำหรับตัวเลข unit เช่น ‘unix’ = 1970-01-01, ‘julian’ หรือ Timestamp ก็ได้ครับ
[cache]ไม่บังคับ bool True ถ้า True จะ cache ผลการแปลง string เพื่อความเร็ว ใช้ได้ดีกับข้อมูลที่มีวันที่ซ้ำหลายแถวครับ

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

ผมคิดว่าปัญหาคลาสสิกที่นักวิเคราะห์ข้อมูลเจอบ่อยมากคือ คอลัมน์วันที่ที่ Excel หรือ CSV ส่งมาให้มักเป็น string ธรรมดา เช่น ‘2024-01-15′ หรือ ’15/01/2024’ ซึ่ง pandas ยังไม่รู้ว่ามันคือวันที่จริงๆ ครับ pd.to_datetime() คือเครื่องมือที่ใช้แปลงตรงนั้นให้เป็น datetime64 ที่ทำงานได้จริง

พอแปลงแล้ว ข้อมูลวันที่จะปลดล็อกความสามารถหลายอย่างมากครับ ทั้งเรียงลำดับได้ถูกต้อง คำนวณระยะห่างระหว่างวันได้เป็นตัวเลข และที่ผมใช้บ่อยที่สุดคือ .dt accessor ที่ช่วยดึงปี เดือน วันในสัปดาห์ออกมาแยกคอลัมน์ได้เลย

ที่เจ๋งคือมี parameter format= ที่บอก pandas ว่าสตริงนั้นหน้าตาเป็นยังไง เช่น ‘%d/%m/%Y’ สำหรับ ’31/12/2024′ ซึ่งช่วยให้แปลงได้เร็วและแม่นยำมาก และมี errors=’coerce’ สำหรับจัดการค่าผิดพลาดในข้อมูลจริงโดยไม่ให้โปรแกรมพัง

ส่วนตัวผมแนะนำให้แปลงคอลัมน์วันที่ทันทีตั้งแต่ขั้นตอนโหลดข้อมูลเลยครับ ไม่ต้องรอให้ต้องใช้ทีหลัง เพราะถ้าคอลัมน์ยังเป็น string อยู่ มักทำให้เจอ bug ตอน sort หรือ filter แบบงงๆ 😎

Examples

ตัวอย่างที่ 1: แปลง Series ของ string 'YYYY-MM-DD' ให้เป็น datetimepd.to_datetime(df['date_str'])

ผมส่ง Series ของ string วันที่มาตรฐาน ISO ('YYYY-MM-DD') เข้าไปครับ pandas แปลงให้เป็น datetime64 อัตโนมัติเลยโดยไม่ต้องระบุ format= พอแปลงแล้วคอลัมน์นี้จะเรียงลำดับได้ถูกต้องและคำนวณวันต่างกันได้ทันที

>_
pd.to_datetime(df['date_str'])

ผลลัพธ์0 2024-01-15
1 2024-02-20
2 2024-03-05
Name: date_str, dtype: datetime64[us]
ตัวอย่างที่ 2: แปลง string รูปแบบ DD/MM/YYYY ด้วย format=pd.to_datetime(df['date_str'], format='%d/%m/%Y')

รูปแบบ DD/MM/YYYY แบบนี้ pandas ไม่ได้ infer ได้เสมอไปครับ ผมจึงระบุ format='%d/%m/%Y' ให้ชัดเจน ช่วยให้แปลงได้ถูกต้องและเร็วกว่าด้วย เพราะไม่ต้องลองเดารูปแบบ — สำคัญมากกับข้อมูลไทยที่มักใช้รูปแบบนี้ครับ

>_
pd.to_datetime(df['date_str'], format='%d/%m/%Y')

ผลลัพธ์0 2024-01-31
1 2024-02-28
2 2024-03-15
Name: date_str, dtype: datetime64[us]
ตัวอย่างที่ 3: ดึงปีและเดือนออกมาด้วย .dt accessordf['date'].dt.year

พอแปลงเป็น datetime แล้ว ผมใช้ .dt.year ดึงปีออกมาเป็น Series ตัวเลขได้ทันทีครับ ทำแบบเดียวกันได้กับ .dt.month, .dt.day, .dt.dayofweek, .dt.quarter และอีกเยอะมาก เหมือนกับการแยกคอลัมน์ปี-เดือน-วันใน Excel YEAR()/MONTH() เลยครับ

>_
df['date'].dt.year

ผลลัพธ์0 2024
1 2024
2 2024
Name: date, dtype: int32
ตัวอย่างที่ 4: จัดการค่าผิดพลาดด้วย errors='coerce'pd.to_datetime(df['date_str'], errors='coerce')

ข้อมูลจริงมักมีค่าผิดพลาดแทรกอยู่ครับ ผมใช้ errors='coerce' เพื่อบอกว่าถ้าแปลงไม่ได้ก็ใส่ NaT (Not a Time) แทนแทนที่จะ raise error ทำให้โปรแกรมทำงานต่อได้ แล้วค่อยกรองหรือ fillna ทีหลังตามความเหมาะสมครับ

>_
pd.to_datetime(df['date_str'], errors='coerce')

ผลลัพธ์0 2024-01-15
1 NaT
2 2024-03-05
3 NaT
Name: date_str, dtype: datetime64[us]

FAQs

ทำไมต้องแปลงเป็น datetime ก่อน ใช้ string ตรงๆ ไม่ได้เหรอ?+

ใช้ได้บางอย่างครับ แต่พังหลายจุดมากเลย 😅 ปัญหาหลักคือการเรียงลำดับ string วันที่แบบ '2/1/2024' < '10/1/2024' ไม่ถูกต้อง (เพราะ '2' > '1' ใน string) และที่สำคัญคือทำ date arithmetic ไม่ได้ เช่น หาว่าสองวันต่างกันกี่วัน ผมเจอ bug แบบนี้บ่อยมากตอนยังใหม่อยู่ครับ แปลงก่อนเสมอดีกว่า

format='%d/%m/%Y' กับ dayfirst=True ต่างกันยังไง?+

format= บอก pattern ชัดเจน 100% ว่าแต่ละส่วนอยู่ตรงไหนครับ แปลงได้แน่นอนและเร็วกว่า ส่วน dayfirst=True แค่ hint ให้ pandas เวลา infer อัตโนมัติ ซึ่งอาจ override ได้ถ้าหน้าตาข้อมูลมันดูเหมือน month-first มากกว่า ผมแนะนำให้ระบุ format= ตรงๆ เลยถ้าทราบรูปแบบ ไม่ต้องพึ่ง dayfirst ครับ

ผลลัพธ์เป็น DatetimeIndex บางทีแต่บางทีเป็น Series ทำไม?+

ขึ้นอยู่กับ input ครับ ถ้าส่ง list หรือ array เข้าไปจะได้ DatetimeIndex กลับมา แต่ถ้าส่ง Series เข้าไปจะได้ Series กลับมา ในทางปฏิบัติผมมักใช้กับ Series (df['date_col']) ซึ่งได้ Series datetime64 กลับมา แล้ว assign กลับเข้าคอลัมน์ตามปกติเลยครับ

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas to_datetime จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas to_datetimeTransform
Transform (3)
pandas apply

apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ

pandas astype

astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น int หรือ float เป็น str ทำให้คำนวณได้ถูกต้องและประหยัด memory มากขึ้นครับ

pandas .dt

pandas .dt accessor ผมใช้สำหรับดึงส่วนต่างๆ ของวันที่ออกจาก datetime Series เช่น ปี เดือน วัน ชื่อวัน หรือไตรมาส เหมือนกับที่ Excel มีฟังก์ชัน YEAR() MONTH() DAY() WEEKDAY() แต่ทำได้กับทั้งคอลัมน์พร้อมกันในคำสั่งเดียวเลยครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่