การแยกคุณลักษณะตามเวลา
ใช้แอตทริบิวต์ .dt เพื่อดึงปี เดือน วัน day_of_week และชั่วโมงจากคอลัมน์ datetime สำหรับการสร้างคุณลักษณะ
การแยกคุณลักษณะตามเวลา เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- DatetimeIndex และช่วงเวลา
- การปรับความถี่อนุกรมเวลา
- การเลื่อนและคุณลักษณะหน่วงเวลา
- การแยกคุณลักษณะตามเวลา