Pengantar
Data dapat direpresentasikan dalam berbagai bentuk – dan cara yang nyaman untuk merepresentasikan tanggal dan waktu adalah string. Namun, untuk bekerja dengan tanggal dan waktu ini secara aritmatika (seperti menghitung perbedaan waktu, menambah atau menghapus waktu, dll.) – kita perlu mengonversinya menjadi datetime
obyek.
Salah satu sumber paling umum dari datetime berformat string adalah REST API yang mengembalikan string agnostik, yang kemudian dapat kita konversi ke format lain.
Selain itu – zona waktu adalah masalah umum saat bekerja dengan objek datetime, jadi kita harus memikirkannya saat mengonversi juga.
Dalam panduan ini – kita akan melihat cara mengonversi tanggal/waktu string menjadi a
datetime
objek dengan Python, menggunakan built-indatetime
modul, tetapi juga modul pihak ketiga sepertidateutil
,arrow
dan Maya, memperhitungkan zona waktu.
Konversi String Menggunakan datetime
Grafik tanggal Waktu modul terdiri dari tiga jenis objek yang berbeda: date
, time
, dan datetime
. itu date
objek memegang tanggal, time
memegang waktu, dan datetime
memegang tanggal dan waktu!
import datetime
print(f'Current date/time: {datetime.datetime.now()}')
Menjalankan kode ini akan menghasilkan:
Current date/time: 2022-12-01 10:27:03.929149
Jika tidak ada pemformatan khusus yang diberikan, format string default akan digunakan, yaitu format untuk “2022-12-01 10:27:03.929149” ada di ISO 8601 format (YYYY-MM-DDTHH:MM:SS.mmmmmm). Jika string input kami untuk membuat a datetime
objek dalam format ISO 8601 yang sama atau jika Anda mengetahui format yang akan Anda terima di awal, kami dapat dengan mudah mengurainya menjadi datetime
obyek:
import datetime
date_time_str = '2022-12-01 10:27:03.929149'
date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f')
print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)
Menjalankannya akan mencetak tanggal, waktu, dan tanggal-waktu:
Date: 2022-12-01
Time: 10:27:03.929149
Date-time: 2022-12-01 10:27:03.929149
Di sini, kami menggunakan strptime()
metode, yang menerima dua argumen:
- Tanggal berformat string
- Format argumen pertama
Menentukan format seperti ini membuat parsing lebih cepat sejak itu datetime
tidak perlu mencoba dan menginterpretasikan formatnya sendiri, yang jauh lebih mahal secara komputasi. Nilai pengembalian adalah tipe datetime
.
Dalam contoh kita, "2022-12-01 10:27:03.929149"
adalah string input dan "%Y-%m-%d %H:%M:%S.%f"
adalah format string tanggal kita. Yang kembali datetime
nilai disimpan sebagai date_time_obj
.
Karena ini adalah datetime
objek, kita dapat memanggil date()
dan time()
metode langsung di atasnya. Seperti yang Anda lihat dari output, ini mencetak bagian 'tanggal' dan 'waktu' dari string input!
Memformat Token
Perlu meluangkan waktu sejenak untuk memahami format token - Yang "%Y-%m-%d %H:%M:%S.%f"
dari sebelumnya.
Setiap token mewakili bagian tanggal-waktu yang berbeda, seperti hari, bulan, tahun, hari dalam sebulan atau minggu, dll. daftar token yang didukung cukup luas untuk mengaktifkan berbagai pemformatan. Beberapa yang umum digunakan, yang juga telah kami gunakan sebelumnya adalah:
%Y
: Tahun (4 digit)%m
: Bulan%d
: Hari bulan%H
: Jam (24 jam)%M
: Menit%S
: Detik%f
: Mikrodetik
Catatan: Semua token ini, kecuali tahunnya, diharapkan tidak terisi (yaitu Agustus adalah bulan ke-8, dan diisi nol hingga 08
).
Menggunakan strptime() Token Format untuk Mengonversi String ke Format Datetime Berbeda
Jika format string diketahui, string dapat dengan mudah diuraikan menjadi a datetime
objek menggunakan strptime()
. Mari kita lihat contoh non-sepele yang menerjemahkan dari satu format ke format lainnya:
import datetime
date_time_str = 'Jul 17 2022 9:20AM'
date_time_obj = datetime.datetime.strptime(date_time_str, '%b %d %Y %I:%M%p')
print('Date:', date_time_obj.date())
print('Time:', date_time_obj.time())
print('Date-time:', date_time_obj)
String masukan adalah satu format – “17 Juli 2022 9:20”. Mengetahui format ini, kami memetakan elemen penyusun ke format ISO 8601 dan mengubahnya menjadi a datetime
obyek:
Date: 2022-07-17
Time: 09:20:00
Date-time: 2022-07-17 09:20:00
Berikut adalah daftar singkat datetimes berformat string umum dan format yang sesuai untuk strptime()
:
"Jun 28 2018 at 7:40AM" -> "%b %d %Y at %I:%M%p"
"September 18, 2017, 22:19:55" -> "%B %d, %Y, %H:%M:%S"
"Sun,05/12/99,12:30PM" -> "%a,%d/%m/%y,%I:%M%p"
"Mon, 21 March, 2015" -> "%a, %d %B, %Y"
"2018-03-12T10:12:45Z" -> "%Y-%m-%dT%H:%M:%SZ"
Anda dapat mengurai string tanggal-waktu dalam format apa pun – selama Anda menggunakan string token format yang benar untuk masukan yang Anda terima.
Konversi String ke Datetime dengan Timezones
Menangani tanggal-waktu menjadi lebih kompleks saat menangani zona waktu. Semua contoh di atas sejauh ini naif terhadap zona waktu. Ini dikenal sebagai objek datetime yang naif.
Namun, datetime
objek berisi bidang persis untuk menyimpan data terkait zona waktu - tzinfo
:
import datetime as dt
dtime = dt.datetime.now()
print(dtime)
print(dtime.tzinfo)
Grafik tzinfo
bidang yang dimaksud adalah a datetime.timezone
objek, menunjukkan informasi zona waktu. Dia None
secara default, dan menunjukkan bahwa objek datetime naif zona waktu. Pustaka eksternal yang sangat umum untuk menangani zona waktu adalah pytz
. Anda dapat mengatur PyTz objek sebagai tzinfo
lapangan juga.
Jika Anda belum memilikinya – instal melalui:
$ pip install pytz
Menggunakan PyTz, kita dapat membuat jangkar untuk waktu sadar zona waktu, seperti UTC:
import datetime as dt
import pytz
dtime = dt.datetime.now(pytz.utc)
print(dtime)
print(dtime.tzinfo)
Keluaran:
2022-12-01 02:07:41.960920+00:00
UTC
Ini bukan lagi jam 11 pagi, tapi jam 2 pagi, karena kami telah mengatur zona waktu beberapa jam ke belakang! Ini mengubah zona waktu dari tanggal waktu.
+00:00
adalah perbedaan antara waktu yang ditampilkan dan waktu UTC sebagai jangkar koordinasi global. Kami telah menetapkan waktu dalam UTC, jadi offsetnya adalah 00:00
. Ini adalah objek sadar zona waktu.
Demikian pula, kita dapat mengganti interpretasi datetime yang sama di antara zona waktu. Mari kita ubah sebuah string, seperti "2022-06-29 17:08:00" menjadi datetime lalu melokalisir ke zona waktu "Amerika/New_York":
import datetime as dt
import pytz
date_time_str = '2022-06-29 17:08:00'
date_time_obj = dt.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S')
timezone = pytz.timezone('America/New_York')
timezone_date_time_obj = timezone.localize(date_time_obj)
print(timezone_date_time_obj)
print(timezone_date_time_obj.tzinfo)
Catatan: Lokalisasi mengubah datetime yang naif zona waktu menjadi datetime yang sadar zona waktu, dan memperlakukan zona waktu sebagai zona waktu lokal. Dengan demikian, datetime tetap sama, tetapi mengingat zona waktu yang berbeda, ini tidak lagi mewakili titik waktu yang sama yang tidak terikat dari zona waktu.
Kami mendapatkan hal yang sama nilai tanggal waktu, diimbangi dengan -04: 00 dibandingkan dengan waktu UTC:
2022-06-29 17:08:00-04:00
America/New_York
17:08 di Tokyo tidak titik waktu yang sama dengan 17:08 di New York. 17:08 di Tokyo adalah 3:08 di New York.
Bagaimana cara menemukan semua kode/alias zona waktu?
Untuk menemukan semua zona waktu yang tersedia, periksa all_timezones
, yang merupakan daftar semua zona waktu yang tersedia:
print(f'There are {len(pytz.all_timezones)} timezones in PyTzn')
for time_zone in pytz.all_timezones:
print(time_zone)
Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!
There are 594 timezones in PyTz
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
...
Ubah Zona Waktu Datetime
Kami dapat mengonversi zona waktu dari zona waktu yang sadar datetime
objek dari satu wilayah ke wilayah lain, alih-alih melokalkan waktu yang naif zona waktu melalui lensa beberapa zona waktu.
Ini berbeda dari pelokalan, karena pelokalan mewakili titik waktu yang berbeda, tetapi mengubah zona waktu suatu objek mewakili titik waktu yang sama, melalui lensa yang berbeda:
import datetime as dt
import pytz
timezone_nw = pytz.timezone('America/New_York')
nw_datetime_obj = dt.datetime.now(timezone_nw)
timezone_london = pytz.timezone('Europe/London')
london_datetime_obj = nw_datetime_obj.astimezone(timezone_london)
print('America/New_York:', nw_datetime_obj)
print('Europe/London:', london_datetime_obj)
Pertama, kami membuat satu objek datetime dengan waktu saat ini dan menetapkannya sebagai zona waktu "Amerika/New_York". Kemudian menggunakan astimezone()
metode, kami telah dikonversi ini datetime
ke zona waktu “Eropa/London”. Keduanya datetime
s akan mencetak nilai yang berbeda, menggunakan offset UTC sebagai tautan referensi di antaranya:
America/New_York: 2022-11-30 21:24:30.123400-05:00
Europe/London: 2022-12-01 02:24:30.123400+00:00
2:24 keesokan harinya di London is titik waktu yang sama dengan 21:24 hari sebelumnya di New York karena London 5 jam lebih awal.
Seperti yang diharapkan, waktu tanggal berbeda karena jaraknya sekitar 5 jam.
Konversi String ke Datetime Menggunakan Perpustakaan Pihak Ketiga
Python datetime
module dapat mengonversi semua jenis string yang berbeda menjadi a datetime
obyek. Tetapi masalah utamanya adalah untuk melakukan ini, Anda perlu membuat string kode pemformatan yang sesuai strptime()
bisa mengerti. Membuat string ini membutuhkan waktu dan membuat kode lebih sulit dibaca.
Sebagai gantinya, kita bisa menggunakan library pihak ketiga lainnya untuk mempermudah.
Dalam beberapa kasus, pustaka pihak ketiga ini juga memiliki dukungan bawaan yang lebih baik untuk memanipulasi dan membandingkan tanggal-waktu, dan beberapa bahkan memiliki zona waktu bawaan, jadi Anda tidak perlu menyertakan paket PyTz tambahan.
Mari kita lihat beberapa perpustakaan ini di bagian berikut.
Konversikan String ke Datetime dengan dateutil
Grafik modul dateutil merupakan perpanjangan dari datetime
modul. Salah satu keuntungannya adalah kita tidak perlu meneruskan kode parsing apa pun untuk mengurai string!
Untuk mengonversi string secara otomatis ke datetime tanpa token format menggunakan Python dateutil
:
from dateutil.parser import parse
datetime = parse('2018-06-29 22:21:41')
print(datetime)
Kredensial mikro parse
fungsi akan mengurai string secara otomatis! Anda tidak harus menyertakan string format apa pun. Mari kita coba mengurai berbagai jenis string menggunakan dateutil
:
from dateutil.parser import parse
date_array = [
'2018-06-29 08:15:27.243860',
'Jun 28 2018 7:40AM',
'Jun 28 2018 at 7:40AM',
'September 18, 2017, 22:19:55',
'Sun, 05/12/1999, 12:30PM',
'Mon, 21 March, 2015',
'2018-03-12T10:12:45Z',
'2018-06-29 17:08:00.586525+00:00',
'2018-06-29 17:08:00.586525+05:00',
'Tuesday , 6th September, 2017 at 4:30pm'
]
for date in date_array:
print('Parsing: ' + date)
dt = parse(date)
print(dt.date())
print(dt.time())
print(dt.tzinfo)
print('n')
Keluaran:
Parsing: 2018-06-29 08:15:27.243860
2018-06-29
08:15:27.243860
None
Parsing: Jun 28 2018 7:40AM
2018-06-28
07:40:00
None
Parsing: Jun 28 2018 at 7:40AM
2018-06-28
07:40:00
None
Parsing: September 18, 2017, 22:19:55
2017-09-18
22:19:55
None
Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12
12:30:00
None
Parsing: Mon, 21 March, 2015
2015-03-21
00:00:00
None
Parsing: 2018-03-12T10:12:45Z
2018-03-12
10:12:45
tzutc()
Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29
17:08:00.586525
tzutc()
Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29
17:08:00.586525
tzoffset(None, 18000)
Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06
16:30:00
None
Anda dapat melihat bahwa hampir semua jenis string dapat diurai dengan mudah menggunakan dateutil
modul.
Meskipun ini nyaman, ingat sebelumnya bahwa harus memprediksi format membuat kode lebih lambat, jadi jika kode Anda memerlukan kinerja tinggi maka ini mungkin bukan pendekatan yang tepat untuk aplikasi Anda.
Konversi String ke Datetime dengan Maya
Maya juga membuatnya sangat mudah untuk mengurai string dan mengubah zona waktu. Untuk dengan mudah mengonversi string dengan Maya Python:
import maya
dt = maya.parse('2018-04-29T17:45:25Z').datetime()
print(dt.date())
print(dt.time())
print(dt.tzinfo)
Keluaran:
2018-04-29
17:45:25
UTC
Untuk mengonversi waktu ke zona waktu yang berbeda:
import maya
dt = maya.parse('2018-04-29T17:45:25Z').datetime(to_timezone='America/New_York', naive=False)
print(dt.date())
print(dt.time())
print(dt.tzinfo)
Keluaran:
2018-04-29
13:45:25
America/New_York
Sekarang bukankah itu mudah digunakan? Mari kita coba maya
dengan set string yang sama yang telah kita gunakan dateutil
:
import maya
date_array = [
'2018-06-29 08:15:27.243860',
'Jun 28 2018 7:40AM',
'Jun 28 2018 at 7:40AM',
'September 18, 2017, 22:19:55',
'Sun, 05/12/1999, 12:30PM',
'Mon, 21 March, 2015',
'2018-03-12T10:12:45Z',
'2018-06-29 17:08:00.586525+00:00',
'2018-06-29 17:08:00.586525+05:00',
'Tuesday , 6th September, 2017 at 4:30pm'
]
for date in date_array:
print('Parsing: ' + date)
dt = maya.parse(date).datetime()
print(dt)
Keluaran:
Parsing: 2018-06-29 08:15:27.243860
2018-06-29 08:15:27.243860+00:00
Parsing: Jun 28 2018 7:40AM
2018-06-28 07:40:00+00:00
Parsing: Jun 28 2018 at 7:40AM
2018-06-28 07:40:00+00:00
Parsing: September 18, 2017, 22:19:55
2017-09-18 22:19:55+00:00
Parsing: Sun, 05/12/1999, 12:30PM
1999-05-12 12:30:00+00:00
Parsing: Mon, 21 March, 2015
2015-03-21 00:00:00+00:00
Parsing: 2018-03-12T10:12:45Z
2018-03-12 10:12:45+00:00
Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29 17:08:00.586525+00:00
Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29 12:08:00.586525+00:00
Parsing: Tuesday , 6th September, 2017 at 4:30pm
2017-09-06 16:30:00+00:00
Seperti yang Anda lihat, semua format tanggal berhasil diuraikan!
Jika kami tidak memberikan info zona waktu, itu secara otomatis mengubahnya menjadi UTC. Jadi, penting untuk dicatat bahwa kita harus menyediakan to_timezone
dan naive
parameter jika waktunya tidak dalam UTC.
Konversikan String ke Datetime dengan Arrow
panah adalah perpustakaan lain untuk menangani datetime dengan Python. Dan seperti sebelumnya dengan maya
, itu juga mengetahui format datetime secara otomatis. Setelah ditafsirkan, itu mengembalikan Python datetime
objek dari arrow
obyek.
Untuk dengan mudah mengubah string menjadi datetime menggunakan Python arrow
:
import arrow
dt = arrow.get('2018-04-29T17:45:25Z')
print(dt.date())
print(dt.time())
print(dt.tzinfo)
Keluaran:
2018-04-29
17:45:25
tzutc()
Dan inilah cara yang dapat Anda gunakan arrow
untuk mengonversi zona waktu menggunakan to()
Metode:
import arrow
dt = arrow.get('2018-04-29T17:45:25Z').to('America/New_York')
print(dt)
print(dt.date())
print(dt.time())
Keluaran:
2018-04-29T13:45:25-04:00
2018-04-29
13:45:25
Seperti yang Anda lihat, string tanggal-waktu dikonversi ke wilayah "Amerika/New_York".
Sekarang, mari kita kembali menggunakan kumpulan string yang sama yang telah kita gunakan di atas:
import arrow
date_array = [
'2018-06-29 08:15:27.243860',
'2018-03-12T10:12:45Z',
'2018-06-29 17:08:00.586525+00:00',
'2018-06-29 17:08:00.586525+05:00',
]
for date in date_array:
dt = arrow.get(date)
print('Parsing: ' + date)
print(dt)
Kode ini akan gagal untuk string tanggal-waktu yang telah dikomentari, yang merupakan lebih dari separuh contoh kita. Output untuk string lainnya adalah:
Parsing: 2018-06-29 08:15:27.243860
2018-06-29T08:15:27.243860+00:00
Parsing: 2018-03-12T10:12:45Z
2018-03-12T10:12:45+00:00
Parsing: 2018-06-29 17:08:00.586525+00:00
2018-06-29T17:08:00.586525+00:00
Parsing: 2018-06-29 17:08:00.586525+05:00
2018-06-29T17:08:00.586525+05:00
Untuk mengurai dengan benar string tanggal-waktu yang dikomentari, Anda harus meneruskan yang sesuai format token untuk memberikan petunjuk perpustakaan tentang cara menguraikannya.
Kesimpulan
Pada artikel ini kami telah menunjukkan berbagai cara untuk mengurai string ke a datetime
objek dengan Python. Anda dapat memilih Python default datetime
perpustakaan atau salah satu perpustakaan pihak ketiga yang disebutkan dalam artikel ini, di antara banyak lainnya.
Masalah utama dengan default datetime
paket adalah kita perlu menentukan kode penguraian secara manual untuk hampir semua format string tanggal-waktu. Jadi, jika format string Anda berubah di masa mendatang, Anda mungkin juga harus mengubah kode Anda. Tetapi banyak perpustakaan pihak ketiga, seperti yang disebutkan di sini, menanganinya secara otomatis.
Satu lagi masalah yang kita hadapi adalah berurusan dengan zona waktu. Cara terbaik untuk menanganinya adalah selalu menyimpan waktu dalam database Anda sebagai format UTC dan kemudian mengonversinya ke zona waktu lokal pengguna bila diperlukan.
Pustaka ini tidak hanya bagus untuk parsing string, tetapi juga dapat digunakan untuk berbagai jenis operasi terkait tanggal-waktu. Saya akan mendorong Anda untuk membaca dokumen untuk mempelajari fungsionalitas secara detail.