Mengubah String menjadi datetime dengan Python

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-in datetime modul, tetapi juga modul pihak ketiga seperti dateutil, 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 datetimes 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.

Stempel Waktu:

Lebih dari penyalahgunaan