pandas .dt accessor ผมใช้สำหรับดึงส่วนต่างๆ ของวันที่ออกจาก datetime Series เช่น ปี เดือน วัน ชื่อวัน หรือไตรมาส เหมือนกับที่ Excel มีฟังก์ชัน YEAR() MONTH() DAY() WEEKDAY() แต่ทำได้กับทั้งคอลัมน์พร้อมกันในคำสั่งเดียวเลยครับ
Series.dt.year
Series.dt.year
Series
คืนเป็น Series ของค่าที่ดึงออกมาครับ เช่น .dt.year คืน Series ของตัวเลขปี, .dt.day_name() คืน Series ของ string ชื่อวัน — เอาไป assign เป็นคอลัมน์ใหม่ หรือต่อด้วย groupby ได้เลย
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| year | property | Optional | ดึงปี (integer) ออกจาก datetime Series — เทียบเท่า YEAR() ใน Excel | |
| month | property | Optional | ดึงเดือน 1-12 ออกจาก datetime Series — เทียบเท่า MONTH() ใน Excel | |
| day | property | Optional | ดึงวันที่ในเดือน 1-31 ออกจาก datetime Series — เทียบเท่า DAY() ใน Excel | |
| dayofweek | property | Optional | ดึงวันในสัปดาห์ 0=Monday ถึง 6=Sunday — เทียบเท่า WEEKDAY() ใน Excel (แต่ index ต่างกัน) | |
| day_name() | method | Optional | คืนชื่อวันเป็น string เช่น ‘Monday’, ‘Tuesday’ — ไม่มีใน Excel ตรงๆ ต้องใช้ TEXT(A1,”dddd”) | |
| quarter | property | Optional | ดึงไตรมาส 1-4 ออกจาก datetime Series — ไม่มีใน Excel โดยตรง ต้องคำนวณเอง |
df['date'].dt.yeardf['date'].dt.year
0 2024
1 2024
2 2025
Name: date, dtype: int32
df['month']df['month']
0 1
1 7
2 3
Name: month, dtype: int32
df['date'].dt.day_name()df['date'].dt.day_name()
0 Monday
1 Tuesday
2 Wednesday
3 Saturday
Name: date, dtype: str
df.groupby('quarter')['revenue'].sum()df.groupby('quarter')['revenue'].sum()
quarter
1 50000
2 75000
3 60000
4 90000
Name: revenue, dtype: int64
ต้องเสมอเลยครับ ถ้าคอลัมน์ยังเป็น string แล้วลอง .dt.year จะได้ error ว่า ‘Can only use .dt accessor with datetimelike values’ ผมเจอบ่อยมากตอนเริ่มใช้ pandas ใหม่ๆ วิธีแก้คือใส่ pd.to_datetime() ก่อนเสมอ เช่น df[‘date’] = pd.to_datetime(df[‘date’]) แล้วค่อยใช้ .dt ได้เลย
ต่างกันที่จุดเริ่มต้นครับ pandas .dt.dayofweek นับ 0=Monday, 1=Tuesday, …, 6=Sunday แต่ Excel WEEKDAY() โดยค่า default นับ 1=Sunday, 2=Monday, …, 7=Saturday ผมเลยต้องระวังตอนเปรียบเทียบผลกับ Excel ถ้าอยากให้ตรงกัน ให้บวก 1 แล้วปรับ offset เองครับ หรือใช้ .dt.day_name() แทน แล้วกรองตามชื่อวันไปเลยชัวร์กว่า
ได้ครับ แต่ .dt ใช้สำหรับดึงส่วนประกอบของวันที่ออกมา ส่วนการคำนวณระยะห่างระหว่างวันผมทำด้วยการลบ datetime columns ตรงๆ เช่น df[‘end’] – df[‘start’] ได้ Timedelta Series ออกมา แล้วค่อยใช้ .dt.days เพื่อแปลงเป็นจำนวนวันต่อได้ครับ
ถ้าใน Excel เราใช้ YEAR(A1) เพื่อดึงปีออกจากวันที่ ใน pandas ผมใช้ .dt.year ทำแบบเดียวกันครับ แต่ดีกว่าตรงที่มันทำงานกับทั้งคอลัมน์พร้อมกันเลย ไม่ต้องลากสูตรลงทีละแถว
.dt คือ “accessor” ที่เปิดให้ Series เข้าถึง datetime properties ต่างๆ — เงื่อนไขเดียวคือ Series นั้นต้องเป็น datetime type ก่อนครับ ถ้าคอลัมน์เก็บเป็น string ต้องแปลงด้วย pd.to_datetime() ก่อนเสมอ
ที่เจ๋งคือ .dt มี property ให้เลือกเยอะมาก ครอบคลุมทุกอย่างที่ Excel ทำได้และมากกว่านั้น: .dt.year (YEAR), .dt.month (MONTH), .dt.day (DAY), .dt.day_name() (ชื่อวัน เช่น Monday), .dt.dayofweek (WEEKDAY เริ่มจาก 0=Monday), .dt.quarter (ไตรมาส), .dt.week (สัปดาห์ที่) และอีกหลายสิบตัว
ส่วนตัวผมใช้บ่อยที่สุดตอนต้องจัดกลุ่มยอดขายตามเดือนหรือไตรมาส ก็แค่ดึง .dt.month หรือ .dt.quarter ออกมาเป็นคอลัมน์ใหม่ แล้วต่อด้วย groupby ได้เลยครับ 😎