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 เพื่อความเร็ว ใช้ได้ดีกับข้อมูลที่มีวันที่ซ้ำหลายแถวครับ |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ผมคิดว่าปัญหาคลาสสิกที่นักวิเคราะห์ข้อมูลเจอบ่อยมากคือ คอลัมน์วันที่ที่ 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 แบบงงๆ 😎
ผมส่ง Series ของ string วันที่มาตรฐาน ISO ('YYYY-MM-DD') เข้าไปครับ pandas แปลงให้เป็น datetime64 อัตโนมัติเลยโดยไม่ต้องระบุ format= พอแปลงแล้วคอลัมน์นี้จะเรียงลำดับได้ถูกต้องและคำนวณวันต่างกันได้ทันที
รูปแบบ DD/MM/YYYY แบบนี้ pandas ไม่ได้ infer ได้เสมอไปครับ ผมจึงระบุ format='%d/%m/%Y' ให้ชัดเจน ช่วยให้แปลงได้ถูกต้องและเร็วกว่าด้วย เพราะไม่ต้องลองเดารูปแบบ — สำคัญมากกับข้อมูลไทยที่มักใช้รูปแบบนี้ครับ
พอแปลงเป็น datetime แล้ว ผมใช้ .dt.year ดึงปีออกมาเป็น Series ตัวเลขได้ทันทีครับ ทำแบบเดียวกันได้กับ .dt.month, .dt.day, .dt.dayofweek, .dt.quarter และอีกเยอะมาก เหมือนกับการแยกคอลัมน์ปี-เดือน-วันใน Excel YEAR()/MONTH() เลยครับ
ข้อมูลจริงมักมีค่าผิดพลาดแทรกอยู่ครับ ผมใช้ errors='coerce' เพื่อบอกว่าถ้าแปลงไม่ได้ก็ใส่ NaT (Not a Time) แทนแทนที่จะ raise error ทำให้โปรแกรมทำงานต่อได้ แล้วค่อยกรองหรือ fillna ทีหลังตามความเหมาะสมครับ
ใช้ได้บางอย่างครับ แต่พังหลายจุดมากเลย 😅 ปัญหาหลักคือการเรียงลำดับ string วันที่แบบ '2/1/2024' < '10/1/2024' ไม่ถูกต้อง (เพราะ '2' > '1' ใน string) และที่สำคัญคือทำ date arithmetic ไม่ได้ เช่น หาว่าสองวันต่างกันกี่วัน ผมเจอ bug แบบนี้บ่อยมากตอนยังใหม่อยู่ครับ แปลงก่อนเสมอดีกว่า
format= บอก pattern ชัดเจน 100% ว่าแต่ละส่วนอยู่ตรงไหนครับ แปลงได้แน่นอนและเร็วกว่า ส่วน dayfirst=True แค่ hint ให้ pandas เวลา infer อัตโนมัติ ซึ่งอาจ override ได้ถ้าหน้าตาข้อมูลมันดูเหมือน month-first มากกว่า ผมแนะนำให้ระบุ format= ตรงๆ เลยถ้าทราบรูปแบบ ไม่ต้องพึ่ง dayfirst ครับ
ขึ้นอยู่กับ input ครับ ถ้าส่ง list หรือ array เข้าไปจะได้ DatetimeIndex กลับมา แต่ถ้าส่ง Series เข้าไปจะได้ Series กลับมา ในทางปฏิบัติผมมักใช้กับ Series (df['date_col']) ซึ่งได้ Series datetime64 กลับมา แล้ว assign กลับเข้าคอลัมน์ตามปกติเลยครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas to_datetime จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ
astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น int หรือ float เป็น str ทำให้คำนวณได้ถูกต้องและประหยัด memory มากขึ้นครับ
pandas .dt accessor ผมใช้สำหรับดึงส่วนต่างๆ ของวันที่ออกจาก datetime Series เช่น ปี เดือน วัน ชื่อวัน หรือไตรมาส เหมือนกับที่ Excel มีฟังก์ชัน YEAR() MONTH() DAY() WEEKDAY() แต่ทำได้กับทั้งคอลัมน์พร้อมกันในคำสั่งเดียวเลยครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่