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

การแยกวิเคราะห์วันที่อย่างถูกต้อง

แปลงสตริงวันที่เป็น datetime64 ด้วย pd.to_datetime จัดการรูปแบบวันที่หลายแบบ และกำหนด DatetimeIndex

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

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

เหตุใดการแยกวิเคราะห์วันที่จึงสำคัญ

ข้อมูลวันและเวลาพบได้ทั่วไปในชุดข้อมูลจริง เช่น เวลาประทับของธุรกรรม วันเกิด บันทึกเหตุการณ์ และช่วงเวลาทางการเงิน เมื่อวันที่ถูกจัดเก็บเป็นสตริง (dtype object) คุณจะไม่สามารถคำนวณระยะเวลา สุ่มตัวอย่างข้อมูลตามเดือน หรือเรียงตามลำดับเวลาได้ การแปลงสตริงเป็น dtype datetime64 ของ Pandas จะเปิดใช้ API สำหรับอนุกรมเวลาอย่างเต็มรูปแบบและทำให้การวิเคราะห์ตามเวลาเป็นไปได้

import pandas as pd

df = pd.DataFrame({'date': ['2024-01-15', '2024-03-20', '2024-07-04']})
print(df['date'].dtype)  # object

# You cannot do arithmetic on string dates
# df['date'] + pd.Timedelta('1 day')  # TypeError!

# After parsing:
df['date'] = pd.to_datetime(df['date'])
print(df['date'].dtype)        # datetime64[ns]
print(df['date'] + pd.Timedelta('1 day'))

พื้นฐานของ pd.to_datetime()

pd.to_datetime(series) เป็นฟังก์ชันหลักสำหรับแปลงคอลัมน์สตริงเป็น datetime64 ฟังก์ชันนี้ฉลาดพอที่จะจดจำรูปแบบวันที่ทั่วไปส่วนใหญ่ได้โดยอัตโนมัติ เช่น ISO 8601 วันที่แบบ US และวันที่แบบยุโรป โดยไม่ต้องระบุสตริงรูปแบบ ผลลัพธ์คือ Series ที่มี dtype datetime64[ns] ซึ่งมีความละเอียดระดับนาโนวินาทีและจัดเก็บเวลาประทับตั้งแต่ปี 1677 ถึง 2262 ได้

import pandas as pd

dates = pd.Series([
    '2024-01-15',
    '15/01/2024',
    'January 15, 2024',
    '2024-01-15 08:30:00'
])

parsed = pd.to_datetime(dates)
print(parsed)
# 0   2024-01-15 00:00:00
# 1   2024-01-15 00:00:00
# 2   2024-01-15 00:00:00
# 3   2024-01-15 08:30:00
print(parsed.dtype)  # datetime64[ns]

การระบุอาร์กิวเมนต์ format=

เมื่อการอนุมานอัตโนมัติช้าเกินไปหรือมีความกำกวม เช่น '01-02-03' อาจหมายถึงวันที่ 2 มกราคม 2003 วันที่ 1 กุมภาพันธ์ 2003 หรือวันที่ 3 กุมภาพันธ์ 2001 ให้ระบุ สตริงรูปแบบ ที่แน่นอนโดยใช้รหัส strftime ของ Python วิธีนี้ยังทำงานได้เร็วขึ้นอย่างมาก โดยในชุดข้อมูลขนาดใหญ่ การแยกวิเคราะห์ด้วยรูปแบบที่ระบุไว้อาจเร็วกว่าแบบอนุมานอัตโนมัติถึง 10 เท่า เพราะ Pandas ไม่จำเป็นต้องลองตรวจสอบรูปแบบหลายแบบ

import pandas as pd

dates = pd.Series(['15/01/2024', '20/03/2024', '04/07/2024'])

# Explicit format: day/month/year
parsed = pd.to_datetime(dates, format='%d/%m/%Y')
print(parsed)
# 0   2024-01-15
# 1   2024-03-20
# 2   2024-07-04

# Common format codes:
# %Y = 4-digit year, %y = 2-digit year
# %m = month (01-12), %d = day (01-31)
# %H = hour (0-23), %M = minute, %S = second

errors='coerce' สำหรับวันที่ไม่ถูกต้อง

ชุดข้อมูลจริงมักมีการพิมพ์ผิดหรือสตริงตัวแทน เช่น 'TBD', 'N/A' หรือ '99/99/9999' อยู่ในคอลัมน์วันที่ การส่ง errors='coerce' จะบอกให้ pd.to_datetime() แปลงค่าที่แยกวิเคราะห์ไม่ได้เป็น NaT (ไม่ใช่เวลา ซึ่งเป็นค่าที่เทียบเท่ากับ NaN สำหรับ datetime) แทนการทำให้เกิดข้อยกเว้น วิธีนี้ช่วยให้คุณระบุและจัดการวันที่ที่ไม่ถูกต้องแยกต่างหากได้

import pandas as pd

dates = pd.Series(['2024-01-15', 'TBD', '2024-07-04', 'N/A'])

parsed = pd.to_datetime(dates, errors='coerce')
print(parsed)
# 0   2024-01-15
# 1          NaT
# 2   2024-07-04
# 3          NaT

# Detect bad dates
print('Bad date rows:', parsed.isna().sum())  # 2

parse_dates ใน read_csv()

จุดที่มีประสิทธิภาพที่สุดในการแยกวิเคราะห์วันที่คือขณะ โหลดข้อมูล โดยใช้พารามิเตอร์ parse_dates ของ pd.read_csv() ให้ส่งรายการชื่อคอลัมน์ (หรือดัชนีคอลัมน์) ที่ควรแยกวิเคราะห์เป็นวันที่ วิธีนี้ไม่ต้องมีขั้นตอนประมวลผลภายหลังแยกต่างหาก และมักทำงานได้เร็วกว่า เพราะ Pandas จัดการให้ระหว่างการแยกวิเคราะห์ CSV ระดับ C

import pandas as pd
import io

csv_data = '''order_id,order_date,ship_date
1,2024-01-15,2024-01-18
2,2024-02-20,2024-02-22
'''

df = pd.read_csv(
    io.StringIO(csv_data),
    parse_dates=['order_date', 'ship_date']
)
print(df.dtypes)
# order_id      int64
# order_date    datetime64[ns]
# ship_date     datetime64[ns]

ตัวเข้าถึง .dt สำหรับองค์ประกอบวันที่

เมื่อคอลัมน์มี dtype datetime64 แล้ว ตัวเข้าถึง .dt จะเปิดให้ใช้คุณสมบัติและเมธอดได้หลายสิบรายการ คุณสามารถดึงค่า .dt.year, .dt.month, .dt.day, .dt.hour, .dt.dayofweek (0=วันจันทร์) และ .dt.is_month_end ได้ สิ่งเหล่านี้ใช้สำหรับสร้างคุณลักษณะในการพยากรณ์อนุกรมเวลาและจัดกลุ่มข้อมูลตามช่วงเวลา

import pandas as pd

df = pd.DataFrame({
    'event_time': pd.to_datetime([
        '2024-03-15 08:30:00',
        '2024-07-04 14:00:00',
        '2024-12-25 09:00:00'
    ])
})

df['year'] = df['event_time'].dt.year
df['month'] = df['event_time'].dt.month
df['day_of_week'] = df['event_time'].dt.day_name()
df['hour'] = df['event_time'].dt.hour
print(df[['year', 'month', 'day_of_week', 'hour']])

การตั้งค่า DatetimeIndex

ในการวิเคราะห์อนุกรมเวลา แนวทางมาตรฐานคือกำหนดคอลัมน์ datetime ให้เป็น ดัชนี ของ DataFrame เมื่อมี DatetimeIndex คุณจะสามารถเลือกข้อมูลตามช่วงเวลา (df['2024'], df['2024-01':'2024-06']) สุ่มตัวอย่างใหม่ให้เป็นความถี่ใดก็ได้ และเข้าถึง API สำหรับอนุกรมเวลาของ Pandas ได้อย่างเต็มรูปแบบ ใช้ set_index() หรือส่ง index_col ใน read_csv

import pandas as pd

df = pd.DataFrame({
    'date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03']),
    'temp': [22.5, 23.0, 21.8]
})

df = df.set_index('date')
print(df)
#             temp
# date
# 2024-01-01  22.5
# 2024-01-02  23.0
# 2024-01-03  21.8

# Time-based slicing
print(df['2024-01-02':'2024-01-03'])

การจัดการรูปแบบวันที่หลายรูปแบบ

หากคอลัมน์วันที่มี รูปแบบปะปนกัน เช่น บางแถวเป็นวันที่แบบ ISO และบางแถวเป็นวันที่แบบ US คุณจะไม่สามารถระบุสตริงรูปแบบเดียวได้ ให้ส่ง format='mixed' (Pandas 2.0 ขึ้นไป) เพื่อให้ตรวจหารูปแบบทีละแถว หรือทำความสะอาดคอลัมน์ล่วงหน้าด้วย regex เพื่อปรับวันที่ทั้งหมดให้เป็นรูปแบบเดียวก่อนเรียกใช้ pd.to_datetime()

import pandas as pd

mixed_dates = pd.Series([
    '2024-01-15',
    '03/20/2024',
    '2024-07-04T10:30:00'
])

# format='mixed' handles different formats row-by-row (Pandas >= 2.0)
parsed = pd.to_datetime(mixed_dates, format='mixed')
print(parsed)
# 0   2024-01-15 00:00:00
# 1   2024-03-20 00:00:00
# 2   2024-07-04 10:30:00

Datetime ที่มีข้อมูลเขตเวลา

เวลาประทับในโลกจริงมักมาพร้อมข้อมูลเขตเวลา pd.to_datetime() สามารถแยกวิเคราะห์สตริงส่วนต่าง UTC ได้ เช่น '2024-01-15 08:30:00+05:30' และจัดเก็บเป็น datetime64 ที่มีข้อมูลเขตเวลา ใช้ .dt.tz_convert('UTC') เพื่อปรับเวลาประทับทั้งหมดให้เป็นเขตเวลามาตรฐานเดียวกันสำหรับการเปรียบเทียบและคำนวณที่ถูกต้อง

import pandas as pd

dates = pd.to_datetime(['2024-01-15 08:30:00+05:30', '2024-01-15 10:00:00-08:00'])
print(dates)
# DatetimeIndex(['2024-01-15 08:30:00+05:30', '2024-01-15 10:00:00-08:00'])

# Convert both to UTC for fair comparison
utc_dates = dates.tz_convert('UTC')
print(utc_dates)
# DatetimeIndex(['2024-01-15 03:00:00+00:00', '2024-01-15 18:00:00+00:00'])

การคำนวณความแตกต่างของวันที่

การคำนวณระหว่างคอลัมน์ datetime64 สองคอลัมน์จะสร้าง Series แบบ Timedelta คุณสามารถดึงจำนวนวัน ชั่วโมง หรือวินาทีจาก Timedelta ได้โดยใช้คุณสมบัติ .dt.days, .dt.seconds และ .dt.total_seconds() นี่เป็นวิธีมาตรฐานสำหรับคำนวณอายุ ระยะเวลา หรือคุณลักษณะจำนวนวันนับจากเหตุการณ์ล่าสุด

import pandas as pd

df = pd.DataFrame({
    'start': pd.to_datetime(['2024-01-01', '2024-03-10', '2024-06-15']),
    'end': pd.to_datetime(['2024-01-20', '2024-04-05', '2024-06-30'])
})

df['duration_days'] = (df['end'] - df['start']).dt.days
print(df[['start', 'end', 'duration_days']])
#        start        end  duration_days
# 0 2024-01-01 2024-01-20             19
# 1 2024-03-10 2024-04-05             26
# 2 2024-06-15 2024-06-30             15

pd.date_range() สำหรับสร้างวันที่

pd.date_range(start, end, freq=) จะสร้างลำดับวันที่ที่มีระยะห่างเท่ากันเป็น DatetimeIndex วิธีนี้มีประโยชน์สำหรับสร้างแกนเวลาที่ครบถ้วน ซึ่งคุณสามารถใช้จัดดัชนีข้อมูลใหม่เทียบกับแกนดังกล่าว เพื่อให้ทุกช่วงเวลาตามปฏิทินปรากฏในผลลัพธ์ แม้จะไม่มีเหตุการณ์ในวันนั้นก็ตาม ค่า freq ที่ใช้บ่อย ได้แก่ 'D' (รายวัน), 'ME' (สิ้นเดือน) และ 'h' (รายชั่วโมง)

import pandas as pd

# Weekly dates for the first quarter of 2024
weekly = pd.date_range(start='2024-01-01', end='2024-03-31', freq='W')
print(weekly[:5])
# DatetimeIndex(['2024-01-07', '2024-01-14', '2024-01-21', '2024-01-28', '2024-02-04'])

# Monthly date spine
monthly = pd.date_range(start='2024-01', periods=12, freq='ME')
print(len(monthly), monthly[0], monthly[-1])
# 12 2024-01-31 2024-12-31

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการแยกวิเคราะห์วันที่อย่างถูกต้องใน Pandas

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า pd.to_datetime() แปลงคอลัมน์สตริงเป็น datetime64, format= ใช้ระบุรูปแบบที่แน่นอนเพื่อเพิ่มความเร็วและความถูกต้อง และ errors='coerce' เปลี่ยนวันที่ที่ไม่ถูกต้องเป็น NaT แทนการทำให้โปรแกรมหยุดทำงาน ตัวเข้าถึง .dt ใช้ดึงปี เดือน วัน และองค์ประกอบอื่น ๆ และการตั้งค่า DatetimeIndex ทำให้เลือกข้อมูลตามช่วงเวลาได้ บทถัดไป เราจะสำรวจตัวเข้าถึง .str สำหรับการดำเนินการกับสตริงแบบเวกเตอร์

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

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

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

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

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

บทเรียน “การแยกวิเคราะห์วันที่อย่างถูกต้อง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การแยกวิเคราะห์วันที่อย่างถูกต้อง”

แปลงสตริงวันที่เป็น datetime64 ด้วย pd.to_datetime จัดการรูปแบบวันที่หลายแบบ และกำหนด DatetimeIndex คุณปฏิบัติ 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. การตรวจสอบชนิดข้อมูลของคอลัมน์
  2. การแปลงชนิดด้วย astype()
  3. ชนิดข้อมูลแบบหมวดหมู่
  4. การแยกวิเคราะห์วันที่อย่างถูกต้อง
← กลับไปที่ Pandas & NumPy Academy