DatetimeIndex และช่วงเวลา
สร้าง DatetimeIndex ด้วย pd.date_range แยกวิเคราะห์วันที่ในรูปแบบสตริง และกำหนดคอลัมน์เวลาเป็นดัชนีเพื่อเข้าถึงข้อมูลตามเวลา
DatetimeIndex และช่วงเวลา เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใด Pandas จึงมีเครื่องมือพิเศษสำหรับเวลา
ข้อมูลอนุกรมเวลาต้องการมากกว่าการจัดเก็บวันที่เป็นสตริง คุณจำเป็นต้องเรียงลำดับตามเวลา เลือกช่วงวันที่ ปรับความถี่ใหม่ และดึงองค์ประกอบต่าง ๆ เช่น เดือนและวันในสัปดาห์ Pandas รองรับการทำงานนี้ด้วย DatetimeIndex ซึ่งเป็นดัชนีที่ประกอบด้วยค่า datetime64 และเปิดให้ใช้การดำเนินการเฉพาะทางที่คำนึงถึงเวลา ซึ่งไม่มีในดัชนีจำนวนเต็มหรือสตริงทั่วไป
การสร้าง DatetimeIndex ด้วย pd.date_range()
pd.date_range(start, end, freq) ใช้สร้างลำดับวันที่ที่มีระยะห่างเท่ากัน พารามิเตอร์ freq ระบุช่วงห่างโดยใช้นามแฝงของออฟเซ็ต: 'D' สำหรับวัน 'h' สำหรับชั่วโมง 'ME' สำหรับสิ้นเดือน 'W' สำหรับสัปดาห์ และ 'YE' สำหรับสิ้นปี คุณสามารถส่ง end หรือ periods (จำนวนค่าประทับเวลา) อย่างใดอย่างหนึ่งได้ แต่ไม่สามารถส่งทั้งสองอย่างพร้อมกัน
import pandas as pd
# Daily dates for January 2024
dates = pd.date_range(start='2024-01-01', end='2024-01-07', freq='D')
print(dates)
# DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03',
# '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07'],
# dtype='datetime64[ns]', freq='D')
# 12 month-end dates
months = pd.date_range(start='2024-01-31', periods=12, freq='ME')
print(months[:3])การตั้งค่า DatetimeIndex ให้กับ DataFrame
เพื่อเปิดใช้การดำเนินการตามเวลา ให้ตั้งคอลัมน์วันที่เป็นดัชนีของ DataFrame โดยใช้ set_index() หลังจากแปลงคอลัมน์เป็น datetime64 ด้วย pd.to_datetime() เมื่อดัชนีเป็น DatetimeIndex แล้ว คุณจะใช้การจัดทำดัชนีด้วยสตริงบางส่วนได้ (df['2024-01']) รวมถึงการแบ่งช่วงวันที่และเมธอดทั้งหมดที่คำนึงถึงเวลา
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'value': [10, 15, 12]
})
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
print(df)
# value
# date
# 2024-01-01 10
# 2024-01-02 15
# 2024-01-03 12
print(type(df.index)) # DatetimeIndexการจัดทำดัชนีด้วยสตริงบางส่วน
หนึ่งในคุณสมบัติที่สะดวกที่สุดของ DatetimeIndex คือ การจัดทำดัชนีด้วยสตริงบางส่วน คุณสามารถเลือกแถวตามปี เดือน หรือวันที่ได้โดยส่งสตริงวันที่บางส่วนให้กับ .loc[] ตัวอย่างเช่น df.loc['2024-01'] จะส่งคืนแถวทั้งหมดของเดือนมกราคม 2024 และ df.loc['2024'] จะส่งคืนแถวทั้งหมดของปี 2024 โดยไม่จำเป็นต้องเปรียบเทียบค่าคอลัมน์อย่างชัดเจน
# Create a larger date-indexed Series
s = pd.Series(
range(365),
index=pd.date_range('2024-01-01', periods=365, freq='D')
)
# Select all of January 2024
print(s.loc['2024-01'].shape) # (31,)
# Select a specific date range
print(s.loc['2024-03-01':'2024-03-07'])pd.to_datetime() สำหรับการแยกวิเคราะห์
pd.to_datetime() ใช้แปลงสตริง จำนวนเต็ม (ค่าประทับเวลา Unix) หรือคอลัมน์วันที่ที่มีหลายรูปแบบให้เป็น datetime64 ระบุ format เพื่อกำหนดรูปแบบที่แน่นอน หากวันที่อยู่ในรูปแบบที่ไม่ใช่มาตรฐาน เช่น '%d/%m/%Y' ใช้ errors='coerce' เพื่อแปลงค่าที่แยกวิเคราะห์ไม่ได้เป็น NaT (ไม่ใช่เวลา) แทนการทำให้เกิดข้อผิดพลาด
# Parse standard ISO format
print(pd.to_datetime('2024-06-15'))
# Parse non-standard format
print(pd.to_datetime('15/06/2024', format='%d/%m/%Y'))
# Handle mixed/bad data gracefully
mixed = pd.to_datetime(['2024-01-01', 'bad_date', '2024-06-15'],
errors='coerce')
print(mixed) # NaT for 'bad_date'ตัวเข้าถึง .dt สำหรับองค์ประกอบวันที่และเวลา
เมื่อคอลัมน์ของ DataFrame (ไม่ใช่ดัชนี) มีค่า datetime64 ตัวเข้าถึง .dt จะเปิดให้ใช้คุณสมบัติและเมธอดด้านวันที่และเวลาทั้งหมดกับเวกเตอร์ของคอลัมน์ได้โดยไม่ต้องวนซ้ำ ใช้ตัวเข้าถึงนี้เพื่อดึงค่า .dt.year, .dt.month, .dt.day, .dt.day_of_week, .dt.hour และอื่น ๆ หากวันที่และเวลาอยู่ในดัชนี ให้ใช้ df.index.year โดยตรง
df_col = pd.DataFrame({'date': pd.date_range('2024-01-01', periods=5, freq='D'),
'value': [10, 15, 12, 18, 14]})
df_col['year'] = df_col['date'].dt.year
df_col['month'] = df_col['date'].dt.month
df_col['dow'] = df_col['date'].dt.day_of_week # 0=Monday
df_col['week'] = df_col['date'].dt.isocalendar().week
print(df_col.head())ช่วงเวลาด้วย pd.period_range()
PeriodIndex ใช้แทน ช่วงเวลา แทนค่าประทับเวลาที่เฉพาะเจาะจง pd.period_range(start, periods, freq) ใช้สร้างช่วงเวลารายเดือน รายไตรมาส หรือรายปี ช่วงเวลาอย่าง Period('2024-01', 'M') แทนทั้งเดือนมกราคม 2024 ไม่ใช่เพียงวันที่เริ่มต้น PeriodIndex มีประโยชน์สำหรับการรายงานทางการเงินที่จัดแนวคิดเป็นไตรมาสหรือเดือน
# Monthly periods
periods = pd.period_range('2024-01', periods=6, freq='M')
print(periods)
# PeriodIndex(['2024-01', '2024-02', '2024-03',
# '2024-04', '2024-05', '2024-06'],
# dtype='period[M]')
# Quarterly periods
quarters = pd.period_range('2024Q1', periods=4, freq='Q')
print(quarters) # [2024Q1, 2024Q2, 2024Q3, 2024Q4]การแปลงระหว่างค่าประทับเวลาและช่วงเวลา
คุณสามารถแปลง DatetimeIndex เป็น PeriodIndex ได้ด้วย to_period(freq) และแปลงกลับด้วย to_timestamp() การแปลงเป็นช่วงเวลามีประโยชน์เมื่อต้องการกำกับแถวด้วยเดือนหรือไตรมาสแทนวันที่เฉพาะเจาะจง ทำให้การจัดกลุ่มและการรวมค่ามีความเข้าใจง่ายยิ่งขึ้นสำหรับการวิเคราะห์ตามปฏิทิน
daily_idx = pd.date_range('2024-01-15', periods=5, freq='D')
print('DatetimeIndex:', daily_idx[:3])
# Convert to monthly periods
monthly_idx = daily_idx.to_period('M')
print('PeriodIndex:', monthly_idx[:3])
# PeriodIndex(['2024-01', '2024-01', ...], dtype='period[M]')
# Convert back to timestamps (start of period)
print(monthly_idx.to_timestamp()[:3])การจัดการเขตเวลา
อนุกรมเวลาในโลกจริงมักมีข้อมูลเขตเวลาติดมาด้วย Pandas รองรับ DatetimeIndex ที่มีเขตเวลาผ่าน tz_localize() (ผูกเขตเวลาเข้ากับค่าประทับเวลาที่ไม่มีเขตเวลา) และ tz_convert() (แปลงระหว่างเขตเวลา) ควรทำงานภายในระบบด้วย UTC เสมอ และแปลงเป็นเวลาท้องถิ่นเฉพาะตอนแสดงผล เพื่อหลีกเลี่ยงข้อผิดพลาดจากความกำกวมของเวลาออมแสง
naive = pd.date_range('2024-01-01', periods=3, freq='D')
print('Naive:', naive.tz)
# Attach timezone (localize)
utc = naive.tz_localize('UTC')
print('UTC:', utc)
# Convert to New York time
ny = utc.tz_convert('America/New_York')
print('NY:', ny[:2])การตรวจสอบและเรียงลำดับ DatetimeIndex
การดำเนินการกับอนุกรมเวลา เช่น การปรับความถี่ใหม่และการแบ่งช่วง ต้องใช้ DatetimeIndex ที่เรียงลำดับแล้ว (เพิ่มขึ้นอย่างต่อเนื่อง) ตรวจสอบด้วย df.index.is_monotonic_increasing และเรียงลำดับด้วย df.sort_index() หากจำเป็น DatetimeIndex ที่ไม่ได้เรียงลำดับอาจทำให้เกิดข้อผิดพลาดที่ไม่แสดงออกมาอย่างชัดเจน หรือได้ผลลัพธ์ที่ไม่คาดคิดในการปรับความถี่ใหม่และฟังก์ชันหน้าต่าง
import numpy as np
df_unsorted = pd.DataFrame(
{'value': [10, 15, 12]},
index=pd.to_datetime(['2024-01-03', '2024-01-01', '2024-01-02'])
)
print('Sorted:', df_unsorted.index.is_monotonic_increasing) # False
df_sorted = df_unsorted.sort_index()
print('After sort:', df_sorted.index.is_monotonic_increasing) # True
print(df_sorted)รูปแบบเชิงปฏิบัติ: การสร้าง DataFrame อนุกรมเวลา
ต่อไปนี้คือรูปแบบที่สมบูรณ์สำหรับสร้าง DataFrame ที่ใช้เวลาเป็นดัชนีจากข้อมูลดิบ: แยกวิเคราะห์วันที่ ตั้งค่าดัชนี เรียงลำดับ และตรวจสอบความถี่ของดัชนี การตั้งค่านี้เป็นพื้นฐานของการวิเคราะห์อนุกรมเวลาทั้งหมดในบทเรียนถัดไป — ค่าเฉลี่ยแบบเลื่อน การปรับความถี่ใหม่ และคุณลักษณะแล็กล้วนต้องอาศัย DatetimeIndex ที่สะอาดและเรียงลำดับแล้ว
import numpy as np
# Simulate loading raw data
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=30, freq='D')
df_ts = pd.DataFrame({'sales': np.random.randint(100, 500, 30)}, index=dates)
df_ts.index.name = 'date'
print('Shape:', df_ts.shape)
print('Freq:', df_ts.index.freq)
print('Sorted:', df_ts.index.is_monotonic_increasing)
print(df_ts.head())ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับ DatetimeIndex และช่วงเวลาในบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้วิธีสร้าง DatetimeIndex ด้วย pd.date_range() และแยกวิเคราะห์วันที่ด้วย pd.to_datetime() วิธีใช้ การจัดทำดัชนีด้วยสตริงบางส่วน เพื่อเลือกวันที่อย่างเข้าใจง่าย ความแตกต่างระหว่างชนิด ค่าประทับเวลาและช่วงเวลา และวิธีจัดการกับ เขตเวลา บทถัดไป เราจะสำรวจการปรับความถี่ใหม่เพื่อเปลี่ยนความถี่ของอนุกรมเวลา
คำถามที่พบบ่อย
บทเรียน “DatetimeIndex และช่วงเวลา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “DatetimeIndex และช่วงเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “DatetimeIndex และช่วงเวลา”
สร้าง DatetimeIndex ด้วย pd.date_range แยกวิเคราะห์วันที่ในรูปแบบสตริง และกำหนดคอลัมน์เวลาเป็นดัชนีเพื่อเข้าถึงข้อมูลตามเวลา คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “DatetimeIndex และช่วงเวลา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- DatetimeIndex และช่วงเวลา
- การปรับความถี่อนุกรมเวลา
- การเลื่อนและคุณลักษณะหน่วงเวลา
- การแยกคุณลักษณะตามเวลา