---
title: pandas .dt — ดึงปี/เดือน/วันออกจากคอลัมน์วันที่
url: https://www.thepexcel.com/functions/python/transform/pandas-dt/
type: function-explainer
program: Python
syntax: Series.dt.year
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas .dt — ดึงปี/เดือน/วันออกจากคอลัมน์วันที่

> pandas .dt accessor ผมใช้สำหรับดึงส่วนต่างๆ ของวันที่ออกจาก datetime Series เช่น ปี เดือน วัน ชื่อวั

## คำอธิบาย

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

## Syntax

```excel
Series.dt.year
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| year | No | property |  | ดึงปี (integer) ออกจาก datetime Series — เทียบเท่า YEAR() ใน Excel |
| month | No | property |  | ดึงเดือน 1-12 ออกจาก datetime Series — เทียบเท่า MONTH() ใน Excel |
| day | No | property |  | ดึงวันที่ในเดือน 1-31 ออกจาก datetime Series — เทียบเท่า DAY() ใน Excel |
| dayofweek | No | property |  | ดึงวันในสัปดาห์ 0=Monday ถึง 6=Sunday — เทียบเท่า WEEKDAY() ใน Excel (แต่ index ต่างกัน) |
| day_name() | No | method |  | คืนชื่อวันเป็น string เช่น 'Monday', 'Tuesday' — ไม่มีใน Excel ตรงๆ ต้องใช้ TEXT(A1,"dddd") |
| quarter | No | property |  | ดึงไตรมาส 1-4 ออกจาก datetime Series — ไม่มีใน Excel โดยตรง ต้องคำนวณเอง |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ดึงปีออกจากคอลัมน์วันที่ (เหมือน YEAR() ใน Excel)

```excel
df['date'].dt.year
```

**ผลลัพธ์:** `0    2024
1    2024
2    2025
Name: date, dtype: int32`

ผมแปลง string เป็น datetime ก่อนด้วย pd.to_datetime() แล้วต่อด้วย .dt.year เพื่อดึงปีออกมาครับ ได้ผลเป็น Series ของตัวเลขปี เหมือนกับการใส่สูตร =YEAR(A1) แล้วลากลงทั้งคอลัมน์ใน Excel เลย

### 2. ตัวอย่างที่ 2: ดึงเดือนและสร้างคอลัมน์ใหม่ (เหมือน MONTH() ใน Excel)

```excel
df['month']
```

**ผลลัพธ์:** `0    1
1    7
2    3
Name: month, dtype: int32`

ผมดึงเดือนออกมาเก็บเป็นคอลัมน์ใหม่ชื่อ month ครับ ค่าที่ได้คือ 1-12 เหมือน MONTH() ใน Excel เลย จากนั้นเอาคอลัมน์ month ไปทำ groupby ต่อได้เลย เช่น df.groupby('month')['sales'].sum() เพื่อหายอดขายรวมแต่ละเดือน

### 3. ตัวอย่างที่ 3: ดูชื่อวันในสัปดาห์ด้วย day_name()

```excel
df['date'].dt.day_name()
```

**ผลลัพธ์:** `0       Monday
1      Tuesday
2    Wednesday
3     Saturday
Name: date, dtype: str`

อันนี้ผมชอบมากครับ .dt.day_name() คืนชื่อวันเป็น string เช่น 'Monday', 'Tuesday' ซึ่ง Excel ทำแบบนี้ต้องใช้ TEXT(A1,"dddd") แต่ใน pandas เรียกได้เลยง่ายมาก ดีตอนอยากกรองเฉพาะวันทำงาน หรือดูว่าวันไหนยอดขายดีที่สุด

### 4. ตัวอย่างที่ 4: ดึงไตรมาสเพื่อวิเคราะห์ตาม Quarter

```excel
df.groupby('quarter')['revenue'].sum()
```

**ผลลัพธ์:** `quarter
1    50000
2    75000
3    60000
4    90000
Name: revenue, dtype: int64`

อันนี้คือ workflow จริงที่ผมใช้ประจำเลยครับ ดึง .dt.quarter เก็บเป็นคอลัมน์ก่อน แล้วต่อด้วย groupby เพื่อหารายได้รวมแต่ละไตรมาส ใน Excel ถ้าอยากทำแบบนี้ต้องเขียนสูตร =INT((MONTH(A1)-1)/3)+1 ยาวกว่าเยอะเลยครับ

## หมายเหตุเพิ่มเติม

- 💡 ผมแนะนำให้แปลง datetime ทันทีตอน load ข้อมูลเข้ามาเลยครับ เช่น df = pd.read_csv('data.csv', parse_dates=['date']) pandas จะแปลงให้อัตโนมัติ ไม่ต้องมาเรียก pd.to_datetime() ซ้ำอีกที

- ถ้าต้องการดึงหลาย properties พร้อมกัน ผมสร้างคอลัมน์ใหม่แต่ละตัวแล้วเก็บไว้เลยครับ เช่น df['year'] = df['date'].dt.year แล้ว df['month'] = df['date'].dt.month แยกกัน สะดวกตอนเอาไป groupby ต่อ ไม่ต้องคำนวณซ้ำหลายรอบ

## คำถามที่พบบ่อย

**Q: ต้องแปลงเป็น datetime ก่อนไหม ถ้าคอลัมน์เก็บเป็น string อยู่?**

ต้องเสมอเลยครับ ถ้าคอลัมน์ยังเป็น string แล้วลอง .dt.year จะได้ error ว่า 'Can only use .dt accessor with datetimelike values' ผมเจอบ่อยมากตอนเริ่มใช้ pandas ใหม่ๆ วิธีแก้คือใส่ pd.to_datetime() ก่อนเสมอ เช่น df['date'] = pd.to_datetime(df['date']) แล้วค่อยใช้ .dt ได้เลย

**Q: dayofweek ต่างจาก WEEKDAY() ใน Excel ยังไง?**

ต่างกันที่จุดเริ่มต้นครับ pandas .dt.dayofweek นับ 0=Monday, 1=Tuesday, ..., 6=Sunday แต่ Excel WEEKDAY() โดยค่า default นับ 1=Sunday, 2=Monday, ..., 7=Saturday ผมเลยต้องระวังตอนเปรียบเทียบผลกับ Excel ถ้าอยากให้ตรงกัน ให้บวก 1 แล้วปรับ offset เองครับ หรือใช้ .dt.day_name() แทน แล้วกรองตามชื่อวันไปเลยชัวร์กว่า

**Q: ใช้ .dt ตอนคำนวณระยะห่างระหว่างวันได้ไหม?**

ได้ครับ แต่ .dt ใช้สำหรับดึงส่วนประกอบของวันที่ออกมา ส่วนการคำนวณระยะห่างระหว่างวันผมทำด้วยการลบ datetime columns ตรงๆ เช่น df['end'] - df['start'] ได้ Timedelta Series ออกมา แล้วค่อยใช้ .dt.days เพื่อแปลงเป็นจำนวนวันต่อได้ครับ

## แหล่งข้อมูลเพิ่มเติม

- [pandas Series.dt accessor (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/transform/pandas-dt/](https://www.thepexcel.com/functions/python/transform/pandas-dt/)_
