Otomatisasi dengan Python

Berurusan dengan Tanggal dengan Python

Artikel ini membahas kemungkinan manipulasi yang dapat Anda lakukan pada variabel DateTime.

Apakah Anda kesulitan saat berhadapan dengan objek DateTime? Yah, harus saya akui bahwa saya sering kesulitan. Saya selalu perlu melakukan banyak pencarian untuk menemukan metode yang cocok untuk kasus penggunaan saya. Kemudian, saya memutuskan untuk menulis artikel ini, sebagai dokumentasi untuk para pembaca yang budiman dan saya sendiri.

Latar belakang

Saat saya mengembangkan alat untuk mengotomatiskan persiapan laporan atau kombinasi file Excel, saya harus dapat mengidentifikasi info dari nama file atau folder. Biasanya file yang dihasilkan sistem atau laporan berkala akan diberi nama berdasarkan pola tetap dan akan disimpan dalam folder yang sama.

Nama file biasanya merupakan kombinasi nama laporan, tanggal atau periode laporan, dan ekstensi file—misalnya, laporan berkala bernama “Laporan Konsumsi Listrik 2022_Q4_WW43.xlsx”dan laporan harian bernama “Laporan Permintaan Alat 20221021.csv”. Untuk mengambil file yang benar, kita perlu menghitung tanggal atau periode dalam nama file berdasarkan waktu alat otomatisasi laporan berjalan.

Dengan itu, artikel ini akan disusun seperti di bawah ini:

  1. Mengurai dan Memformat DateTime (strptimevs strftime)
  2. Ekstrak Info Tahun / Bulan / Hari
  3. Hitung Minggu Dunia dari Tanggal
  4. Hitung Hari Minggu dari Tanggal
  5. Konversi Objek DateTime ke Periode
  6. Hitung Interval Waktu Data

Mari kita mulai!

Mengurai DateTime berarti kita mengubah objek string yang berisi tanggal menjadi objek DateTime. Misalnya, ketika kita mendapatkan tanggal dari laporan “Laporan Permintaan Alat 20221021.csv”dengan Regular Expression atau metode lainnya, tanggal “20221021” akan menjadi variabel string.

Setelah kita parsing, maka akan menjadi objek DateTime dan akan ditulis dalam format ISO (YYYY-MM-DD), 2022–10–21. Kemudian kita bisa memformatnya ke dalam format tertentu, seperti 21 Oktober 2022. Perlu diperhatikan bahwa objek DateTime akan menjadi objek string setelah kita memformatnya.

Membingungkan? Jangan khawatir!

Anda akan mendapatkan gambaran yang lebih jelas dari contoh di bawah ini.

1. Mengurai dan Memformat TanggalWaktu

Mengurai TanggalWaktu

Ada dua metode dari perpustakaan DateTime untuk mengurai tanggal:

  • datetime.fromisoformat()
  • datetime.strptime()

Mari kita lihat apa perbedaan di antara keduanya!

import datetime as dt
my_date1 = "2022-07-01"
print(my_date1)
print(type(my_date1))
my_date2 = "01-07-2022"
print(my_date2)
print(type(my_date2))
my_date3 = "01July2022"
print(my_date3)
print(type(my_date3))

Oke, jadi saya membuat 3 tanggal berbeda sebagai variabel, saat ini mereka adalah objek string. Mari kita uraikan ke dalam objek DateTime sekarang.

my_date1a = dt.datetime.fromisoformat(my_date1)
print(type(my_date1a))
my_date3a = dt.datetime.fromisoformat(my_date3)
print(type(my_date3a))

Untuk metode pertama datetime.fromisoformat(), sama seperti nama metodenya, hanya dapat mengurai tanggal yang berformat ISO YYYY-MM-DD, seperti pada variabel bernama my_date1. Oleh karena itu, ketika kami mencoba menggunakan metode ini untuk format DateTime lain seperti pada my_date3, ini akan mengembalikan Value Error. Variabel my_date1a adalah objek DateTime yang kita dapatkan dengan mengurai variabel my_date1.

Di bawah ini adalah contoh penguraian tanggal dengan metode datetime.strptime(). Untuk metode ini, kita harus menentukan kode format berdasarkan format tanggal untuk mengurai tanggal. Anda dapat membaca lebih lanjut tentang kode format di strftime() dan strptime() Behavior.

# my_date2 = "01-07-2022"
my_date2a = dt.datetime.strptime(my_date2, "%d-%m-%Y")
print(type(my_date2a))
print(my_date2a)
# Output:
# <class 'datetime.datetime'>
# 2022-07-03 00:00:00

Mari kita lihat contoh lain dengan format tanggal berbeda.

# my_date3 = "01July2022"
my_date3a = dt.datetime.strptime(my_date3, "%d%B%Y")
print(type(my_date3a))
print(my_date3a)
# Output:
# <class 'datetime.datetime'> 
# 2022-07-01 00:00:00

Penguraian tanggal dengan metode strptime() adalah dengan mengganti hari, bulan dan tahun dengan kode format masing-masing. Seperti terlihat pada contoh di atas, %d untuk hari, %m untuk digit bulan, %B untuk nama lengkap bulan, dan %Y untuk tahun dengan abad.

Yah, ini mungkin terlihat sangat rumit untuk saat ini jika Anda baru mengenalnya, tapi saya jamin Anda akan mahir setelah Anda terbiasa dengan kode formatnya. Ingat, Anda selalu dapat merujuk ke Perilaku strftime() dan strptime(). 😉

Memformat TanggalWaktu

Setelah kita parsing objek string ke dalam objek DateTime, maka akan ditampilkan dalam format ISO. Jika ingin dalam bentuk lain, kita harus menggunakan metode datetime.strftime() untuk memformat tanggal.

# my_date3a: 2022-07-01 00:00:00
my_format_date = dt.datetime.strftime(my_date3a, "%B %d, %Y")
print(my_format_date)
# Output:
# July 01, 2022

Perhatikan bahwa setelah kita memformat tanggal, itu akan menjadi string.

Setelah kita mengurai string ke dalam objek DateTime, kita bisa mendapatkan info darinya.

2. Ekstrak Info Tahun / Bulan / Hari

Catatan: Contoh di bawah ini menggunakan variabel dari contoh di bagian pertama.

Untuk mendapatkan info tahun, bulan dan hari, kita cukup menggunakan atribut masing-masing di bawah ini dari objek DateTime.

  • datetime_object.year
  • datetime_object.month
  • datetime_object.day
# my_date3a: 2022-07-01 00:00:00
# Get Year Info
my_date3a.year
# Output: 
# 2022
# Get Month Info
my_date3a.month
# Output: 
# 7
# Get Day Info
my_date3a.day
# Output: 
# 1

Sederhana bukan? 😄

Namun, kami tidak dapat mengekstrak informasi di atas dari tanggal yang diformat.

# my_format_date = "July 01, 2022"
my_format_date.month

Ini akan mengembalikan Kesalahan Atribut. Hal ini karena ketika kita memformat tanggal ke format lain, maka tanggal tersebut akan menjadi objek string lagi. Kita hanya dapat mengembalikan atribut DateTime dari objek DateTime.

print(type(my_date3a))
print(type(my_format_date))
Output:
<class 'datetime.datetime'> 
<class 'str'>

Ketahuilah bahwa produk strftime() adalah objek string, sedangkan produk strptime() adalah objek DateTime.

3. Hitung Minggu Dunia dari Tanggal

Catatan: Di bagian ini, kita akan menggunakan variabel baru sebagai contoh.

Pertama, saya membuat dua objek string baru dengan tanggal berbeda dan kemudian menguraikannya ke dalam objek DateTime.

import datetime as dt
my_date_str_1 = "2022-07-01"
my_date_1 = dt.datetime.strptime(my_date_str_1, "%Y-%m-%d")
print(my_date_1)
my_date_str_2 = "2022-07-03"
my_date_2 = dt.datetime.strptime(my_date_str_2, "%Y-%m-%d")
print(my_date_2)
# Output:
# 2022-07-01 00:00:00 
# 2022-07-03 00:00:00

Kita akan menggunakan metode isocalendar() untuk mendapatkan info minggu dunia dari objek DateTime. Hal ini karena objek DateTime tidak memiliki atribut minggu dunia.

print(my_date_1.isocalendar())
print(my_date_2.isocalendar())
# Output:
# datetime.IsoCalendarDate(year=2022, week=26, weekday=5) 
# datetime.IsoCalendarDate(year=2022, week=26, weekday=7)

Metode isocalendar() akan mengembalikan tupel yang berisi tahun ISO, nomor minggu, dan hari kerja. Hari kerja akan dikembalikan sebagai angka. Kita dapat mengembalikan nilainya dengan indeks masing-masing.

print("Date 1: 2022-07-01")
print("Year:", my_date_1.isocalendar()[0])
print("World Week Number: ", my_date_1.isocalendar()[1])
print("Weekday: ", my_date_1.isocalendar()[2])
print("Date 2: 2022-07-03")
print("Year:", my_date_2.isocalendar()[0])
print("World Week Number: ", my_date_2.isocalendar()[1])
print("Weekday: ", my_date_2.isocalendar()[2])
# Output:
# Date 1: 2022-07-01 
# Year: 2022 
# World Week Number:  26 
# Weekday:  5 
# Date 2: 2022-07-03 
# Year: 2022 
# World Week Number:  26 
# Weekday:  7

Begitulah cara kita mendapatkan nomor minggu, juga tahun dan hari kerja.

4. Hitung Hari Minggu dari Tanggal

Catatan: Contoh di bawah ini menggunakan variabel dari contoh di bagian 3.

Ada lebih dari satu metode untuk mengembalikan info hari kerja dari suatu tanggal. Salah satu caranya adalah melalui isocalendar() seperti yang ditunjukkan pada bagian sebelumnya. Metode lainnya adalah menggunakan metode weekday() yang ditunjukkan di bawah ini.

print("Date 1: 2022-07-01")
print("Weekday: ", my_date_1.weekday())
print("Date 2: 2022-07-03")
print("Weekday: ", my_date_2.weekday())
# Output:
# Date 1: 2022-07-01 
# Weekday:  4 
# Date 2: 2022-07-03 
# Weekday:  6

Ya, 01–07–2022 adalah hari Jumat. Metode isocalendar() tidak mengikuti aturan indeks python. Jadi sebenarnya, metode isocalendar() dan weekday() memulai penghitungan pada hari Senin, tetapi isocalendar() menggunakan indeks yang dimulai dari 1, sedangkan hari kerja() adalah fungsi python yang dimulai dari 0. Kedua metode yang disebutkan mengembalikan hari kerja sebagai angka. Ada satu cara lagi untuk melakukannya, bisakah kamu menebaknya🤔?

Itu adalah metode strftime().

Kita bisa mendapatkan nama hari kerja dengan memformat tanggal dengan kode format masing-masing.

date_weekday_1 = dt.datetime.strftime(my_date_1, "%a")
print(date_weekday_1)
date_weekday_2 = dt.datetime.strftime(my_date_2, "%a")
print(date_weekday_2)
# Output:
# Fri 
# Sun

Kita dapat mengembalikan nama singkatan hari kerja dengan memformatnya menggunakan kode format “%a” seperti yang ditunjukkan pada contoh di atas atau mengembalikan nama lengkap hari kerja dengan menggunakan kode format “%A” seperti yang ditunjukkan pada contoh di bawah.

date_weekday_1 = dt.datetime.strftime(my_date_1, "%A")
print(date_weekday_1)
date_weekday_2 = dt.datetime.strftime(my_date_2, "%A")
print(date_weekday_2)
# Output:
# Friday 
# Sunday

Kita juga dapat mengembalikan hari kerja sebagai angka.

date_weekday_1 = dt.datetime.strftime(my_date_1, "%w")
print(date_weekday_1)
date_weekday_2 = dt.datetime.strftime(my_date_2, "%w")
print(date_weekday_2)
# Output:
# 5 
# 0

Fakta menariknya, ketika Anda menggunakan metode strftime(), penghitungan dimulai pada hari Minggu dan indeks dimulai dari 0, seperti yang ditunjukkan dalam dokumentasi.

Untuk pemahaman yang lebih baik, saya telah menggabungkan tabel perbandingan di bawah ini untuk menunjukkan perbedaan antara beberapa metode yang mengembalikan hari kerja sebagai angka dari tanggal yang saya tunjukkan di atas.

5. Ubah Objek DateTime menjadi Periode

Catatan: Di bagian ini, kita akan menggunakan variabel baru sebagai contoh.

Kita telah mempelajari metode dan atribut untuk mengembalikan tahun, bulan, hari, nomor minggu dunia, dan hari kerja. Jika Anda masih ingat contoh nama laporan yang saya berikan di awal artikel ini, “Laporan Konsumsi Listrik 2022_Q4_WW43.xlsx”, masih ada satu informasi yang belum kami peroleh, yaitu seperempat.

Untuk mendapatkan seperempat dari tanggal tersebut, kita harus menggunakan perpustakaan pandas bersama dengan perpustakaan DateTime.

import pandas as pd
import datetime as dt
# pandas.Timestamp.to_period
date_1 = '2022-10-21'
timestamp_1 = pd.Timestamp(date_1)

Pertama, kita membuat tanggal sebagai objek string dan kemudian mengubahnya menjadi stempel waktu. Setelah itu, kita dapat mengubah stempel waktu menjadi titik.

year_period = timestamp_1.to_period(freq='Y')
month_period = timestamp_1.to_period(freq='M')
week_period = timestamp_1.to_period(freq='W')
quarter_period = timestamp_1.to_period(freq='Q')
print("Year: ", year_period)
print("Month: ", month_period)
print("Week: ", week_period)
print("Quarter: ", quarter_period)
# Output:
# Year:  2022 
# Month:  2022-10 
# Week:  2022-10-17/2022-10-23 
# Quarter:  2022Q4

Ini cukup sederhana, bukan?

Menurut dokumentasi resmi pandas, hanya ada 4 jenis keluaran untuk metode pandas.Timestamp.to_period(). Di bagian sebelumnya, kita mendapatkan tahun, bulan, dan minggu secara terpisah. Kemudian, metode ini mengembalikan periode tanggal tertentu. Misalnya, 2022Q4 mengacu pada kuartal ke-4 tahun 2022.

Ada satu langkah lagi yang diperlukan untuk mengambil hanya “Q4” dan bukan “2022Q4”. Variabel quarter_period sekarang menjadi objek titik. Jadi, kita perlu mengubahnya menjadi objek string dan kemudian mengembalikan dua string terakhir untuk mendapatkan “Q4”.

print(str(quarter_period))[-2:]

Selain itu, kita dapat mendefinisikan fungsi python untuk menunjukkan kuartal setiap bulan. Metode ini juga berlaku bila organisasi Anda memiliki metode penghitungan tahun keuangan sendiri. Misalnya, kuartal pertama mungkin jatuh pada bulan November, Desember, dan Januari.

# Output:
# Q4

Gambar di atas menunjukkan cara mengembalikan kuartal ketika organisasi Anda tidak mengikuti definisi kuartal standar. Anda dapat mengubah ketentuan sesuai dengan definisi kuartal organisasi Anda.

6. Hitung Interval DataTime

Catatan: Di bagian ini, kita akan menggunakan variabel baru sebagai contoh.

Ada dua jenis perhitungan untuk interval DateTime:

  1. Hitung interval antara dua tanggal
  2. Tambahkan/kurang interval waktu pada tanggal

Mari kita lihat satu per satu!

Sebelum itu, mari kita buat beberapa tanggal sebagai contoh.

import datetime as dt
my_date1 = dt.datetime.fromisoformat("2022-07-01")
my_date2 = dt.datetime.fromisoformat("2022-07-05")

Hitung interval antara dua tanggal

Menghitung jarak antara dua tanggal sangatlah mudah. Kita hanya perlu mengurangi satu tanggal dengan tanggal lainnya.

print(my_date2 - my_date1)
# Output:
# datetime.timedelta(days=4)

Outputnya akan berupa timedelta, yang mengacu pada perbedaan antara dua objek DateTime.

Tambahkan/kurang interval waktu pada tanggal

Contoh lainnya adalah menambah atau mengurangi interval waktu pada tanggal.

from datetime import timedelta
print(my_date2 - timedelta(days=10))
print(my_date2 + timedelta(days=10))
print(my_date2 - timedelta(seconds=10))
print(my_date2 + timedelta(seconds=10))
# Output:
# 2022-06-25 00:00:00 
# 2022-07-15 00:00:00
# 2022-07-04 23:59:50 
# 2022-07-05 00:00:10

Kami akan menggunakan kelas timedelta dari perpustakaan DateTime untuk operasi ini. Kelas ini memungkinkan kita menambahkan/minus hari, detik, atau mikrodetik ke/dari tanggal.

Kesimpulan

Kesimpulannya, metode penguraian objek string ke dalam objek DateTime dan memformat objek DateTime ke dalam format tertentu telah ditunjukkan. Kemudian dibahas cara mendapatkan tahun, bulan, hari, minggu dunia dan juga hari kerja dari tanggal tersebut.

Cara mengubah objek DateTime menjadi periode, seperti tahun, bulan dalam tahun, dan juga seperempat dalam tahun disajikan. Untuk organisasi yang memiliki metode penghitungan tahun keuangannya sendiri, pernyataan kondisi dapat digunakan untuk menghasilkan kuartal yang benar.

Terakhir, dua jenis perhitungan untuk interval DateTime, yang menghitung interval antara dua tanggal dan menambah/mengurangi interval waktu pada tanggal tersebut dijelaskan.

Dengan semua metode dan contoh yang saya tunjukkan, bisakah Anda membuat ulang nama file di bawah ini dengan tanggal hari ini (26/10/2022)? 😎 Tuliskan jawabanmu di kolom komentar!

  • “Laporan Konsumsi Listrik 2022_Q4_WW43.xlsx”
  • “Laporan Permintaan Alat 20221021.csv”

Jawabannya ada di bagian bawah artikel. Cobalah sendiri sebelum Anda memeriksa jawabannya! 😉

Saya harap Anda menikmati membaca artikel ini dan semoga membantu Anda memahami lebih lanjut tentang cara menangani objek DateTime dengan Python. Terima kasih! 😊

Tetap terhubung

Berlangganan di YouTube

Catatan Samping

Dalam Tips Otomatisasi Laporan dengan Python, saya telah menjelaskan beberapa tips tentang otomatisasi laporan. Coba lihat!

Referensi

  1. Dokumentasi Modul DateTime Python
  2. Dokumentasi pandas.Timestamp.to_period
  3. Perilaku strftime() dan strptime()

Terima kasih dan selamat telah membaca sampai akhir 😊!

Menjawab:

Semoga Anda melakukannya dengan benar! 😊