Kursus
Di Python, string adalah tipe data umum yang digunakan untuk merepresentasikan tanggal dan waktu, tetapi sebagai data scientist dan engineer, kita sering perlu mengonversi string ini menjadi objek datetime untuk melakukan berbagai operasi, seperti pengurutan atau perbandingan.
Mengonversi string menjadi objek datetime bisa jadi rumit, terutama bagi yang baru mengenal Python. Jadi, dalam artikel ini, saya akan memandu Anda melalui langkah-langkah yang diperlukan untuk menggunakan metode-metode ini, dan saya akan menyediakan contoh kode di sepanjang pembahasan. Baik Anda seorang developer berpengalaman atau baru memulai, mari kita selami dunia objek datetime di Python!
Untuk menjalankan semua contoh kode dalam tutorial ini dengan mudah, Anda bisa membuat workbook DataLab secara gratis yang sudah terpasang Python dan berisi semua contoh kode. Untuk latihan lebih lanjut tentang cara mengonversi string menjadi objek datetime, lihat latihan praktis DataCamp ini.
Ringkasan
Gunakan datetime.strptime(date_string, format) untuk mengonversi string menjadi objek datetime di Python. Untuk parsing yang fleksibel tanpa format string, gunakan dateutil.parser.parse(). Untuk DataFrame, pd.to_datetime() menangani seluruh kolom secara efisien. Kode format kunci: %Y (tahun 4 digit), %m (bulan), %d (hari), %H (jam), %M (menit), %S (detik).
Pengenalan Modul datetime di Python
Modul datetime, yang terpasang bawaan dengan Python, dapat digunakan kapan pun Anda perlu bekerja dengan tanggal, waktu, atau selang waktu untuk aplikasi apa pun yang dibangun menggunakan Python. Modul ini menyediakan kelas dan metode yang praktis untuk merepresentasikan dan memanipulasi data tanggal dan waktu.
Tabel 1: Ringkasan kelas dan metode di modul datetime
| Kelas/Metode | Tujuan | Kasus penggunaan umum |
|---|---|---|
| datetime.date | Merepresentasikan tanggal (tahun, bulan, hari). | Menghitung selisih antar tanggal, memformat tanggal sebagai string, mengekstrak komponen tanggal. |
| datetime.time | Merepresentasikan waktu dalam sehari (jam, menit, detik, mikrodetik). | Membandingkan waktu, memformat waktu sebagai string, mengekstrak komponen waktu. |
| datetime.datetime | Merepresentasikan tanggal dan waktu. Menggabungkan fungsionalitas date dan time. | Bekerja dengan data deret waktu, mengekstrak komponen tanggal dan waktu, memformat sebagai string. |
| datetime.timedelta | Merepresentasikan selisih antara dua tanggal atau waktu (durasi). | Menambah/mengurangi durasi ke/dari tanggal atau waktu, menghitung interval waktu. |
| datetime.strptime() | Mem-parse string menjadi objek datetime berdasarkan format yang ditentukan. | Mengonversi string menjadi objek datetime untuk manipulasi dan analisis lebih lanjut. |
| datetime.strftime() | Memformat objek datetime menjadi string berdasarkan format yang ditentukan. | Mengonversi objek datetime menjadi string yang mudah dibaca untuk tampilan atau pelaporan. |
Mari pahami kelas-kelas utama dalam modul ini, karena kita akan mengonversinya menjadi objek datetime:
1. datetime.date
Kelas ini merepresentasikan tanggal (tahun, bulan, dan hari) dan menyediakan metode untuk bekerja dengan tanggal, seperti menghitung selisih antara dua tanggal dan memformat tanggal sebagai string.
Misalkan kita memiliki dataset berisi harga saham harian untuk sebuah perusahaan. Kita dapat menggunakan kelas date untuk mengekstrak tanggal dari dataset dan memplot harga saham dari waktu ke waktu.
Berikut cuplikan yang menampilkan penggunaan kelas date:
from datetime import date
# create a date object representing March 1, 2023
start_date = date(2023, 3, 1)
# extract information such as the year, month, and day
year = start_date.year
month = start_date.month
day = start_date.day
# get the day of the week (Note: Monday is coded as 0, and Sunday as 6)
weekday = start_date.weekday()
# the date can be formatted as a string if needed
date_str = start_date.strftime('%Y-%m-%d')
2. datetime.time
Kelas ini merepresentasikan waktu dalam sehari (jam, menit, detik, dan mikrodetik) dan menyediakan metode untuk bekerja dengan waktu, seperti membandingkan waktu dan memformat waktu sebagai string.
Misalkan kita memiliki dataset berisi waktu finis untuk sebuah lomba; kita dapat menggunakan kelas time untuk mengekstrak jam dan menit dari tiap peserta saat menyelesaikan lomba.
from datetime import time
# create a time object with the microsecond granularity
end_time = time(15, 45, 30, 500000)
# get the hour and minute
hour = end_time.hour
minute = end_time.minute
second = end_time.second
microsecond = end_time.microsecond
3. datetime.datetime
Kelas ini merepresentasikan tanggal dan waktu dan menyediakan metode untuk bekerja dengan keduanya. Kelas ini menggabungkan fungsionalitas dari kelas date dan time.
Kelas ini umum digunakan dalam tugas analisis data yang melibatkan data deret waktu dengan resolusi temporal tinggi, seperti data per jam atau per menit. Misalkan kita memiliki dataset berisi permintaan listrik per jam untuk sebuah kota. Kita dapat menggunakan kelas datetime untuk mengekstrak tanggal dan waktu dari dataset dan memplot permintaan listrik dari waktu ke waktu. Untuk memvisualisasikan data seperti ini, lihat tutorial grafik garis deret waktu Matplotlib kami.
from datetime import datetime
# create a datetime object representing March 1, 2023 at 9:30 AM
start_datetime = datetime(2023, 3, 1, 9, 30)
# get the year, month, day, hour, and minute
year = start_datetime.year
month = start_datetime.month
day = start_datetime.day
hour = start_datetime.hour
minute = start_datetime.minute
4. datetime.timedelta
Kelas ini merepresentasikan durasi atau interval waktu dan menyediakan metode untuk bekerja dengan interval waktu, seperti menambah atau mengurangi interval waktu dari tanggal atau waktu.
Misalkan kita memiliki dataset berisi waktu mulai dan berakhir dari serangkaian acara, dan kita ingin menghitung total durasi semua acara. Kita dapat menggunakan kelas timedelta untuk menghitung durasi tiap acara dan menjumlahkannya.
from datetime import timedelta
# create a timedelta object representing 3 hours and 15 minutes
event_duration = timedelta(hours=3, minutes=15)
# get the total duration in seconds
event_duration_seconds = event_duration.total_seconds()
# add the duration to a start time to get an end time
event_start_time = datetime(2023, 3, 1, 18, 15)
event_end_time = event_start_time + event_duration
Dalam semua kasus yang kita tunjukkan, kita menggunakan objek datetime, namun data dunia nyata sering kali tetap berupa string dalam praktiknya. Dan mengonversinya menjadi objek datetime membuka semua fungsionalitas di atas yang sangat kuat dalam analisis dan aplikasi data science.
Menggunakan datetime.strptime() untuk Konversi Datetime
Di Python, kita dapat menggunakan metode datetime.strptime() untuk mengonversi string menjadi objek datetime. Metode strptime() menerima dua argumen: string yang akan dikonversi dan format string yang menentukan format string masukan.
Format string menggunakan kombinasi kode pemformatan untuk merepresentasikan berbagai komponen tanggal dan waktu. Berikut beberapa kode pemformatan yang paling umum digunakan (konsep serupa berlaku dalam pemformatan string Python):
Tabel 2: Kode pemformatan datetime umum
| Kode format | Deskripsi | Contoh masukan | Contoh keluaran |
|---|---|---|---|
| %Y | Tahun 4 digit | 2023 | 2023 |
| %y | Tahun 2 digit | 23 | 23 |
| %m | Bulan 2 digit (01-12) | 03 | 03 |
| %d | Tanggal 2 digit (01-31) | 15 | 15 |
| %H | Jam 2 digit (00-23) | 14 | 14 |
| %I | Jam 2 digit (01-12) | 02 | 02 |
| %M | Menit 2 digit (00-59) | 45 | 45 |
| %S | Detik 2 digit (00-59) | 30 | 30 |
| %f | Mikrodetik (000000-999999) | 123456 | 123456 |
| %p | AM atau PM | PM | PM |
| %z | Offset UTC | +0530 | +0530 |
| %a | Nama hari singkat | Tue | Tue |
| %A | Nama hari lengkap | Tuesday | Tuesday |
| %b | Nama bulan singkat | Mar | Mar |
| %B | Nama bulan lengkap | March | March |
| %j | Hari ke- (001-366) | 074 | 074 |
| %U | Nomor minggu dalam tahun (Minggu sebagai hari pertama) | 10 | 10 |
| %W | Nomor minggu dalam tahun (Senin sebagai hari pertama) | 09 | 09 |
Sekarang kita memahami direktif strptime, proses mengonversi string menjadi objek datetime dapat dipermudah.
- Langkah 01: Analisis string tanggal-waktu yang akan dikonversi untuk pola yang sesuai dengan kode pemformatan.
- Langkah 02: Buat format tanggal-waktu dari direktif strptime().
- Langkah 03: Berikan string dan format ke fungsi dan terima objek sebagai keluaran.
Mari kita terapkan langkah-langkah ini.
Mengonversi string dalam format tertentu menjadi objek datetime
from datetime import datetime
# Example with the standard date and time format
date_str = '2023-02-28 14:30:00'
date_format = '%Y-%m-%d %H:%M:%S'
date_obj = datetime.strptime(date_str, date_format)
print(date_obj)
# Example with a different format
date_str = '02/28/2023 02:30 PM'
date_format = '%m/%d/%Y %I:%M %p'
date_obj = datetime.strptime(date_str, date_format)
print(date_obj)
Pada contoh pertama, kita memiliki string yang merepresentasikan tanggal dan waktu dalam format ‘YYYY-MM-DD HH:MM:SS’, dan pada contoh kedua dalam format berbeda, ‘MM/DD/YYYY HH:MM AM/PM’.
Untuk kedua kasus, setelah kita menentukan format string yang benar sebagai argumen kedua ke strptime(), kita akan menerima objek datetime yang benar.
Mengonversi string dengan informasi zona waktu menjadi objek datetime
from datetime import datetime
date_str = '2023-02-28 14:30:00+05:30'
date_format = '%Y-%m-%d %H:%M:%S%z'
date_obj = datetime.strptime(date_str, date_format)
print(date_obj)
Dalam contoh ini, kita memiliki string yang merepresentasikan tanggal dan waktu dengan informasi zona waktu dalam format ‘YYYY-MM-DD HH:MM:SS+TZOFFSET’, di mana TZOFFSET adalah offset zona waktu dalam jam dan menit dari UTC. Kita menentukan format string sebagai argumen kedua ke strptime(), termasuk kode pemformatan %z untuk mem-parse offset zona waktu.
Walaupun fungsi yang kita lihat di atas tampak mudah secara teori, fungsi ini juga bisa menjadi sumber frustrasi saat terjadi kesalahan dalam praktik.
Mem-parse tanggal tanpa format string menggunakan dateutil
Opsi fleksibel lainnya adalah pustaka dateutil, khususnya fungsi parser.parse(). Fungsi ini secara otomatis mendeteksi format tanggal, sehingga Anda dapat mem-parse string tanpa menentukan format string.
from dateutil.parser import parse
# Automatically infers the format
date_obj = parse("March 1, 2023 9:30 AM")
print(date_obj)
Ini sangat berguna saat menangani format tanggal yang tidak terduga atau tidak konsisten.
Menangani zona waktu
Untuk penanganan datetime yang peka zona waktu, Python menawarkan dua opsi populer:
-
pytz (banyak digunakan dan kompatibel dengan versi lama)
-
zoneinfo (diperkenalkan di Python 3.9, bagian dari pustaka standar)
from datetime import datetime
from zoneinfo import ZoneInfo
# Using zoneinfo
dt = datetime(2023, 3, 1, 9, 30, tzinfo=ZoneInfo("America/New_York"))
print(dt)
# Using pytz (alternative)
import pytz
tz = pytz.timezone("America/New_York")
dt_pytz = tz.localize(datetime(2023, 3, 1, 9, 30))
print(dt_pytz)
Alat ini memungkinkan Anda menetapkan zona waktu, melakukan konversi antar zona, dan secara otomatis memperhitungkan waktu musim panas (daylight saving time).
Pertimbangan daylight saving time
Saat bekerja dengan datetime yang peka zona waktu, daylight saving time (DST) dapat menyebabkan komplikasi—terutama saat jam dimajukan atau dimundurkan.
Pustaka seperti zoneinfo dan pytz menangani transisi DST secara otomatis ketika Anda menetapkan zona waktu yang sesuai:
from datetime import datetime
from zoneinfo import ZoneInfo
# Before and after DST starts
before_dst = datetime(2023, 3, 12, 1, 30, tzinfo=ZoneInfo("America/New_York"))
after_dst = datetime(2023, 3, 12, 3, 30, tzinfo=ZoneInfo("America/New_York"))
print(before_dst)
print(after_dst)
Ini memastikan perhitungan datetime tetap akurat melintasi perubahan DST.
Menggunakan pandas untuk Konversi Datetime
Meskipun modul datetime bawaan Python sangat kuat, banyak data scientist lebih memilih menggunakan pustaka pandas untuk konversi datetime karena kesederhanaannya dan kemampuannya menangani seluruh kolom tanggal secara efisien menggunakan DataFrame.
import pandas as pd
# Converting a column of strings to datetime objects
date_series = pd.to_datetime(['2023-02-28', '2023-03-01', '2023-03-02'])
print(date_series)
Pandas secara otomatis menebak format dan menangani inkonsistensi umum dengan baik, menjadikannya pilihan utama saat bekerja dengan data tabular. Pelajari lebih lanjut di panduan Persiapan Data dengan pandas kami.
Memformat Objek datetime menjadi String dengan strftime()
Setelah Anda mengonversi string menjadi objek datetime dan melakukan operasi yang diinginkan, Anda mungkin perlu mengonversinya kembali menjadi string. Anda dapat menggunakan datetime.strftime() untuk tujuan ini.
from datetime import datetime
now = datetime.now()
formatted = now.strftime('%Y-%m-%d %H:%M:%S')
print(formatted)
Metode ini memberi Anda kontrol penuh atas bagaimana objek datetime ditampilkan dalam bentuk string.
Memecahkan Masalah Umum strptime()
Berikut beberapa kesalahan umum yang mungkin Anda temui dan cara memperbaikinya. Untuk informasi lebih lanjut tentang penanganan exception di Python, lihat tutorial khusus kami:
ValueError: time data 'date_string' does not match format '%Y-%m-%d %H:%M:%S'
Kesalahan paling umum terjadi saat string masukan tidak sesuai dengan format string. Harap periksa kembali bahwa string masukan dan format string benar-benar cocok.
import datetime
# When using 4-digit year format but input has 2-digit year
date_str = '23-03-01'
date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d') # Wrong: %Y expects 4 digits
# Raises ValueError: time data '23-03-01' does not match format '%Y-%m-%d'
# When format doesn't match separator in string
time_str = '08:30:00'
time_obj = datetime.datetime.strptime(time_str, '%H-%M-%S') # Wrong: using - instead of :
# Raises ValueError: time data '08:30:00' does not match format '%H-%M-%S'
TypeError: strptime() argument 1 must be str, not 'int'
Kesalahan umum berikutnya terjadi saat Anda mengoper integer ke datetime.strptime() atau time.strptime() alih-alih string. Pastikan semua nilai yang Anda oper ke fungsi berupa string.
# Example 1: Integer instead of string
date_int = 20230301
date_obj = datetime.datetime.strptime(date_int, '%Y%m%d')
# Raises TypeError: strptime() argument 1 must be str, not int
# Example 2: List instead of string
date_list = [2023, 3, 1]
date_obj = datetime.datetime.strptime(date_list, '%Y-%m-%d')
# Raises TypeError: strptime() argument 1 must be str, not list
ValueError: unconverted data remains: ':00'
Kesalahan ini terjadi saat ada karakter tersisa dalam string masukan yang tidak dicocokkan oleh format string. Misalnya, kesalahan ini akan terjadi jika format string hanya menentukan tahun, bulan, dan hari, tetapi string masukan juga berisi waktu. Untuk men-debug kesalahan ini, pastikan format string cocok dengan seluruh string masukan.
# when input string contains time of day
date_str = '2023-03-01 12:30:00'
date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
# Raises ValueError: unconverted data remains: 12:30:00
# When input string contains extra characters
date_str = '2023-03-01T00:00:00Z'
date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')
# Raises ValueError: unconverted data remains: T00:00:00Z
Kesimpulan
Dapat dikatakan bahwa metode datetime.strptime() menyediakan cara yang fleksibel dan kuat untuk mengonversi string menjadi objek datetime di Python dan dapat digunakan untuk menangani berbagai format tanggal dan waktu. Mengapa tidak mengambil Cheatsheet Dates and Times kami untuk referensi nanti?
Setelah memahami tanggal dan waktu, langkah berikutnya adalah mempraktikkannya dalam sebuah proyek. Kami merekomendasikan Anda memilih salah satu dari ini dan memantapkan pembelajaran Anda:
Kami sepakat bahwa data tanggal dan waktu di dunia nyata itu rumit, tetapi yang Anda perlukan adalah memahami format dan pola yang mendasari setiap jenis tanggal dan waktu dalam data Anda dan menggunakan pustaka yang ada dengan bijak.
FAQs
Bagaimana saya dapat menangani string dengan format tanggal campuran dalam dataset yang sama?
Saat bekerja dengan dataset yang mencakup format tanggal campuran, Anda dapat menggunakan modul dateutil Python. Fungsi dateutil.parser.parse() lebih fleksibel daripada datetime.strptime() karena dapat secara otomatis mendeteksi dan mem-parse berbagai format tanggal tanpa memerlukan format string yang telah ditentukan:
from dateutil.parser import parse
date_str1 = '2023-03-01'
date_str2 = 'March 1, 2023'
date_obj1 = parse(date_str1)
date_obj2 = parse(date_str2)
print(date_obj1) # Output: 2023-03-01 00:00:00
print(date_obj2) # Output: 2023-03-01 00:00:00Bisakah saya mengonversi string menjadi objek datetime sambil memperhitungkan zona waktu yang berbeda?
Ya, Anda dapat menangani zona waktu dengan menggunakan pustaka pytz bersama dengan datetime. Pertama, konversikan string menjadi objek datetime, lalu lampirkan zona waktu menggunakan pytz.timezone():
from datetime import datetime
import pytz
date_str = '2023-03-01 14:30:00'
date_format = '%Y-%m-%d %H:%M:%S'
date_obj = datetime.strptime(date_str, date_format)
# Set time zone
timezone = pytz.timezone('US/Eastern')
date_obj_tz = timezone.localize(date_obj)
print(date_obj_tz) # Output: 2023-03-01 14:30:00-05:00Apa perbedaan antara datetime.strptime() dan datetime.fromisoformat()?
datetime.strptime() memungkinkan Anda menentukan format string kustom untuk mem-parse format tanggal yang tidak standar atau beragam.
datetime.fromisoformat() dirancang khusus untuk mem-parse string tanggal berformat ISO 8601 (misalnya, '2023-03-01T14:30:00'). Ini lebih sederhana digunakan jika string Anda benar-benar mengikuti standar ISO 8601:
from datetime import datetime
iso_date_str = '2023-03-01T14:30:00'
date_obj = datetime.fromisoformat(iso_date_str)
print(date_obj) # Output: 2023-03-01 14:30:00Bagaimana cara mengonversi objek datetime kembali menjadi string di Python?
Gunakan metode strftime() untuk mengonversi objek datetime kembali menjadi string. Berikan format string yang menentukan seperti apa tampilan keluaran yang Anda inginkan:
from datetime import datetime
dt = datetime(2023, 3, 1, 14, 30)
date_string = dt.strftime('%Y-%m-%d %H:%M:%S')
print(date_string) # Output: 2023-03-01 14:30:00Kode format sama dengan yang digunakan bersama strptime(), sehingga mudah untuk bolak-balik antara string dan objek datetime.
Apa perbedaan antara strptime() dan strftime() di Python?
strptime() dan strftime() adalah operasi yang berlawanan:
strptime()("string parse time") mengonversi string menjadi objek datetime. Metode ini menerima string dan format sebagai argumen.strftime()("string format time") mengonversi objek datetime menjadi string. Metode ini memformat datetime sesuai format string yang ditentukan.
Mnemonik yang membantu: strptime() mem-parse string, sedangkan strftime() memformat menjadi string.
Sebagai senior data scientist, saya merancang, mengembangkan, dan menerapkan solusi machine learning berskala besar untuk membantu bisnis membuat keputusan yang lebih baik berbasis data. Sebagai penulis di bidang data science, saya berbagi pembelajaran, saran karier, dan tutorial praktis yang mendalam.

