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

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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