Pandas & NumPy Academy · บทเรียน

การแยกคุณลักษณะตามเวลา

ใช้แอตทริบิวต์ .dt เพื่อดึงปี เดือน วัน day_of_week และชั่วโมงจากคอลัมน์ datetime สำหรับการสร้างคุณลักษณะ

บทเรียน 4 จาก 413 ขั้นตอน

การแยกคุณลักษณะตามเวลา เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องดึงฟีเจอร์ตามเวลา

คอลัมน์ datetime64 ดิบไม่สื่อความหมายสำหรับอัลกอริทึมแมชชีนเลิร์นนิงส่วนใหญ่ เพราะอัลกอริทึมเหล่านี้ไม่สามารถเข้าใจได้ว่า 2024-12-25 เป็นวันหยุด หรือ Friday ทำให้ยอดขายปลีกสูงขึ้น วิศวกรรมฟีเจอร์ตามเวลาจะแยกองค์ประกอบที่มีความหมายจากคอลัมน์วันที่และเวลา เช่น ปี เดือน วัน วันในสัปดาห์ และชั่วโมง ออกมาเป็นคอลัมน์เชิงตัวเลขหรือเชิงหมวดหมู่แยกกัน เพื่อให้แบบจำลองและฟังก์ชันวิเคราะห์นำไปใช้ได้โดยตรง

ตัวเข้าถึง .dt

เมื่อคอลัมน์ของ DataFrame มีชนิดข้อมูล datetime64 ตัวเข้าถึง .dtจะเปิดให้เข้าถึงคุณสมบัติและเมธอดของวันที่และเวลาแบบเวกเตอร์ได้ แทนที่จะใช้ฟังก์ชัน Python กับแต่ละแถวทีละแถว คุณสามารถเขียน df['date'].dt.year แล้ว Pandas จะคำนวณปีให้ทุกแถวด้วยการดำเนินการเดียวที่รวดเร็ว ตัวเข้าถึงเดียวกันนี้ยังใช้กับคอลัมน์ timedelta64 ได้ โดยมีคุณสมบัติที่แตกต่างกัน

import pandas as pd

df = pd.DataFrame({
    'event_date': pd.date_range('2024-01-01', periods=8, freq='D'),
    'revenue': [200, 350, 280, 310, 420, 380, 190, 260]
})

# Access datetime properties with .dt
print(df['event_date'].dt.year)    # 2024 for all
print(df['event_date'].dt.month)   # 1 for all
print(df['event_date'].dt.day[:5]) # 1, 2, 3, 4, 5

การดึงองค์ประกอบของวันที่

คุณสมบัติ .dt ที่ใช้บ่อยที่สุดสำหรับองค์ประกอบของวันที่ ได้แก่ .dt.year, .dt.month, .dt.day, .dt.day_of_week (0=วันจันทร์ ถึง 6=วันอาทิตย์), .dt.day_of_year, .dt.week หรือ .dt.isocalendar().week, .dt.quarter และ .dt.days_in_month แต่ละรายการจะคืนค่า Series ของจำนวนเต็ม ซึ่งสามารถใช้เป็นฟีเจอร์ได้โดยตรง

df['year']        = df['event_date'].dt.year
df['month']       = df['event_date'].dt.month
df['day']         = df['event_date'].dt.day
df['day_of_week'] = df['event_date'].dt.day_of_week  # 0=Mon
df['quarter']     = df['event_date'].dt.quarter
df['day_of_year'] = df['event_date'].dt.day_of_year

print(df[['event_date', 'year', 'month', 'day',
           'day_of_week', 'quarter']].head())

การดึงองค์ประกอบของเวลา

สำหรับคอลัมน์วันที่และเวลาที่มีข้อมูลเวลา ไม่ใช่เพียงวันที่ ให้ใช้ .dt.hour, .dt.minute, .dt.second และ .dt.microsecond สิ่งเหล่านี้สำคัญสำหรับการวิเคราะห์ภายในวัน การสร้างแบบจำลองพฤติกรรมผู้ใช้ (รูปแบบช่วงเช้าเทียบกับช่วงเย็น) และทุกระบบที่ช่วงเวลาของวันมีผลต่อตัวแปรเป้าหมาย

df_ts = pd.DataFrame({
    'timestamp': pd.date_range('2024-01-01', periods=6, freq='4h'),
    'logins': [50, 200, 320, 280, 180, 90]
})

df_ts['hour']   = df_ts['timestamp'].dt.hour
df_ts['minute'] = df_ts['timestamp'].dt.minute
df_ts['date']   = df_ts['timestamp'].dt.date    # Python date object
df_ts['time']   = df_ts['timestamp'].dt.time    # Python time object
print(df_ts[['timestamp', 'hour', 'date']].head())

ชื่อวันและชื่อเดือน

สำหรับป้ายกำกับที่อ่านเข้าใจได้โดยมนุษย์ ให้ใช้ .dt.day_name() และ .dt.month_name() เพื่อรับชื่อวันและเดือนในรูปสตริง เช่น 'Monday' และ 'January' สิ่งเหล่านี้มีประโยชน์สำหรับแสดงในรายงานและสร้างฟีเจอร์เชิงหมวดหมู่ที่เข้ารหัสผลของวันในสัปดาห์หรือเดือน นอกจากนี้ คุณยังสามารถส่ง locale เพื่อรับชื่อในภาษาอื่นได้

df['day_name']   = df['event_date'].dt.day_name()
df['month_name'] = df['event_date'].dt.month_name()

print(df[['event_date', 'day_name', 'month_name']].head(5))
# event_date day_name month_name
# 2024-01-01   Monday    January
# 2024-01-02  Tuesday    January
# 2024-01-03  Wednesday  January

แฟล็กวันหยุดสุดสัปดาห์และวันทำการ

ฟีเจอร์ที่ใช้กันทั่วไปมากคือแฟล็กแบบบูลีนที่ระบุว่าวันที่อยู่ในช่วงวันหยุดสุดสัปดาห์หรือไม่ day_of_week >= 5 จะให้ค่า True สำหรับวันเสาร์ (5) และวันอาทิตย์ (6) หากต้องการฟีเจอร์ปฏิทินวันทำการที่ซับซ้อนขึ้น numpy.busdaycalendar จะจัดการวันหยุดให้ แต่ในกรณีส่วนใหญ่ การแบ่งวันธรรมดากับวันหยุดสุดสัปดาห์แบบง่าย ๆ ก็ครอบคลุมผลกระทบส่วนใหญ่แล้ว

df['is_weekend'] = df['event_date'].dt.day_of_week >= 5
df['is_weekday'] = ~df['is_weekend']

# Compare weekend vs weekday revenue
print(df.groupby('is_weekend')['revenue'].mean().round(1))
# is_weekend
# False    308.3  <- weekday average
# True     285.0  <- weekend average

แฟล็กต้นและปลายช่วงเวลา

ตัวเข้าถึง .dt ยังมีคุณสมบัติแบบบูลีนที่ระบุว่าวันที่อยู่ต้นหรือปลายช่วงเวลาหรือไม่ ได้แก่ .dt.is_month_start, .dt.is_month_end, .dt.is_quarter_start, .dt.is_quarter_end, .dt.is_year_start และ .dt.is_year_end สิ่งเหล่านี้มีประโยชน์สำหรับตรวจจับช่วงเวลาการรายงาน รอบการเรียกเก็บเงิน และผลกระทบจากขอบเขตของฤดูกาล

dates_series = pd.Series(
    pd.date_range('2024-01-28', periods=10, freq='D')
)

print(dates_series[dates_series.dt.is_month_start].values)
# ['2024-02-01']

print(dates_series[dates_series.dt.is_month_end].values)
# ['2024-01-31']

การเข้ารหัสฟีเจอร์ตามเวลาแบบวัฏจักร

เดือนและชั่วโมงมีลักษณะเป็นวัฏจักร — เดือนธันวาคม (12) อยู่ใกล้กับเดือนมกราคม (1) และเวลา 23:00 อยู่ใกล้กับเวลา 00:00 การมองค่าเหล่านี้เป็นจำนวนเต็มเชิงเส้น (1-12 หรือ 0-23) ทำให้แบบจำลองส่วนใหญ่เข้าใจผิด ให้เข้ารหัสฟีเจอร์แบบวัฏจักรด้วยการแปลงไซน์และโคไซน์: sin(2π × value / max_value) และ cos(2π × value / max_value) วิธีนี้ฝังโครงสร้างแบบวงกลมลงในคอลัมน์เชิงตัวเลขสองคอลัมน์ เพื่อให้แบบจำลองใช้งานได้อย่างถูกต้อง

import numpy as np

# Cyclical encoding for month (1-12)
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)

# Cyclical encoding for day of week (0-6)
df['dow_sin'] = np.sin(2 * np.pi * df['day_of_week'] / 7)
df['dow_cos'] = np.cos(2 * np.pi * df['day_of_week'] / 7)

print(df[['month', 'month_sin', 'month_cos']].head().round(3))

การคำนวณทางคณิตศาสตร์ของ Timedelta

การลบคอลัมน์วันที่และเวลาสองคอลัมน์จะสร้าง Series ชนิด timedelta64 ตัวเข้าถึง .dt บน Series ของ timedelta จะเปิดให้ใช้ .dt.days, .dt.seconds และ .dt.total_seconds() ทำให้คุณคำนวณระยะเวลาของเหตุการณ์ เวลาที่ผ่านไปนับจากการซื้อครั้งล่าสุด และอายุเป็นวันได้ ทั้งหมดอยู่ในรูปคอลัมน์เชิงตัวเลขที่พร้อมสำหรับการวิเคราะห์ต่อ

df_orders = pd.DataFrame({
    'order_date':    pd.to_datetime(['2024-01-01', '2024-02-10', '2024-03-05']),
    'delivery_date': pd.to_datetime(['2024-01-04', '2024-02-13', '2024-03-12'])
})

# Compute delivery time in days
df_orders['delivery_days'] = (
    df_orders['delivery_date'] - df_orders['order_date']
).dt.days
print(df_orders)

การใช้คุณสมบัติ .dt ของดัชนี

เมื่อวันที่และเวลาเป็นดัชนีของ DataFrame (เป็น DatetimeIndex) แทนที่จะเป็นคอลัมน์ ให้เข้าถึงคุณสมบัติเดียวกันจากดัชนีโดยตรงโดยไม่ใช้ .dt: df.index.year, df.index.month, df.index.day_of_week และอื่น ๆ คุณสามารถเพิ่มคุณสมบัติเหล่านี้เป็นคอลัมน์ใหม่ได้โดยตรง: df['month'] = df.index.month

df_indexed = df.set_index('event_date')

# Access components directly on the DatetimeIndex
print(df_indexed.index.month[:3])  # [1, 1, 1]
print(df_indexed.index.day_of_week[:3])  # [0, 1, 2]

# Add as new columns
df_indexed['month']   = df_indexed.index.month
df_indexed['weekday'] = df_indexed.index.day_of_week
print(df_indexed.head())

กระบวนการวิศวกรรมฟีเจอร์ตามเวลาแบบครบถ้วน

ต่อไปนี้คือฟังก์ชันวิศวกรรมฟีเจอร์ตามเวลาแบบครบถ้วน ซึ่งรับ DataFrame ที่มีคอลัมน์วันที่และเวลา แล้วคืนค่า DataFrame ที่เติมฟีเจอร์ตามเวลาซึ่งมีประโยชน์ที่สุด รูปแบบนี้สามารถนำไปใช้ได้โดยตรงตั้งแต่เริ่มต้นกระบวนการแมชชีนเลิร์นนิงหรือการวิเคราะห์ใด ๆ ที่ทำงานกับข้อมูลเหตุการณ์ซึ่งมีการประทับเวลา

def add_temporal_features(df, date_col):
    dt = df[date_col].dt
    df['year']       = dt.year
    df['month']      = dt.month
    df['day']        = dt.day
    df['day_of_week'] = dt.day_of_week
    df['quarter']    = dt.quarter
    df['is_weekend'] = dt.day_of_week >= 5
    df['month_sin']  = (2 * 3.14159 * dt.month / 12).__round__(4)
    df['month_cos']  = (2 * 3.14159 * dt.month / 12).__round__(4)
    return df

result = add_temporal_features(df.copy(), 'event_date')
print(result.columns.tolist())

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการดึงฟีเจอร์ตามเวลาจากคอลัมน์วันที่และเวลา

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า ตัวเข้าถึง .dt ช่วยให้เข้าถึงคุณสมบัติของวันที่และเวลาทั้งหมดแบบเวกเตอร์ได้ ฟีเจอร์ที่ดึงมาใช้บ่อย ได้แก่ ปี เดือน วัน day_of_week ชั่วโมง และไตรมาส การเข้ารหัสแบบวัฏจักรด้วยไซน์และโคไซน์ช่วยจัดการลักษณะเป็นวงกลมของชั่วโมงและเดือน และการคำนวณทางคณิตศาสตร์ของ timedeltaช่วยให้คำนวณระยะเวลาเป็นวันหรือวินาทีได้ บทถัดไป เราจะสำรวจสถาปัตยกรรม Figure และ Axes ของ Matplotlib เพื่อสร้างแผนภูมิคุณภาพระดับสิ่งพิมพ์

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

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

บทเรียน “การแยกคุณลักษณะตามเวลา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแยกคุณลักษณะตามเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแยกคุณลักษณะตามเวลา”

ใช้แอตทริบิวต์ .dt เพื่อดึงปี เดือน วัน day_of_week และชั่วโมงจากคอลัมน์ datetime สำหรับการสร้างคุณลักษณะ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การแยกคุณลักษณะตามเวลา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. DatetimeIndex และช่วงเวลา
  2. การปรับความถี่อนุกรมเวลา
  3. การเลื่อนและคุณลักษณะหน่วงเวลา
  4. การแยกคุณลักษณะตามเวลา
← กลับไปที่ Pandas & NumPy Academy