Rekam transaksi, log server, dan data sensor semuanya membawa penanda waktu. Jika tanggal disimpan sebagai list objek datetime Python, setiap operasi — “berapa hari sejak tanggal itu?”, “geser semua transaksi tujuh hari” — harus dieksekusi elemen demi elemen lewat loop Python. NumPy menawarkan dtype khusus datetime64: tanggal-waktu disimpan sebagai bilangan bulat 64-bit plus satuan (unit) tetap, sehingga aritmetika waktunya dapat ter-vektorisasi seperti aritmetika angka biasa.

Selisih dua datetime64 menghasilkan dtype pendamping bernama timedelta64, yang mewakili durasi. Keduanya berpasangan: datetime64 menjawab “kapan”, timedelta64 menjawab “berapa lama”.

Membuat datetime64 dan Peran Unit #

np.datetime64 menerima string tanggal-waktu. NumPy menyimpulkan unit dari format string: string berisi hanya tahun-bulan-tanggal mendapat unit D (hari), sedangkan unit dapat dipaksa lewat argumen kedua:

python
import numpy as np

t = np.datetime64("2026-10-17")
print(t, t.dtype)
y = np.datetime64("2026-10-17", "s")
print(y, y.dtype)
t2 = np.datetime64("2026-10-17T09:30")
print(t2)

Output yang Dihasilkan:

text
2026-10-17 datetime64[D]
2026-10-17T00:00:00 datetime64[s]
2026-10-17T09:30

Mari kita bedah:

  1. Baris 3 (np.datetime64("2026-10-17")): string tanpa bagian jam membuat unit disimpulkan sebagai D; nilainya tersimpan sebagai jumlah hari sejak acuan internal.
  2. Baris 5 (np.datetime64("2026-10-17", "s")): unit dipaksa s (detik), dan pencetakan menunjukkan nilai yang dilengkapi T00:00:00 — tanggal yang sama, presisi berbeda.
  3. Baris 7: string dengan jam dan menit menghasilkan objek berpresisi menit; penampilannya mengikuti bagian string yang tersedia.

Daftar unit yang tersedia, dari paling kasar ke paling halus:

UnitArtiContoh penulisan string
Ytahun"2026"
Mbulan"2026-10"
Dhari"2026-10-17"
hjam"2026-10-17T09"
mmenit"2026-10-17T09:30"
sdetik"2026-10-17T09:30:15"
msmilidetik"2026-10-17T09:30:15.500"
nsnanodetik"2026-10-17T09:30:15.500000000"

Aritmetika dengan timedelta64 #

Menjumlahkan datetime64 dengan timedelta64 menggeser waktu; mengurangkan dua datetime64 menghasilkan durasi. Unit hasil operasi menyesuaikan presisi operand yang paling halus:

python
import numpy as np

h = np.datetime64("2026-10-17")
print(h + np.timedelta64(3, "D"))
print(h + np.timedelta64(12, "h"))
selisih = np.datetime64("2026-10-17") - np.datetime64("2026-10-01")
print(selisih, selisih.dtype)

Output yang Dihasilkan:

text
2026-10-20
2026-10-17T12
16 days timedelta64[D]

Penjelasan tiap baris:

  1. Baris 5: datetime64 unit D ditambah timedelta64 3 hari menghasilkan tanggal baru, masih berunit D.
  2. Baris 6: penambahan 12 jam memaksa hasil naik ke presisi jam — terlihat dari format T12 pada hasil cetak.
  3. Baris 7-8: pengurangan dua tanggal menghasilkan 16 days bertipe timedelta64[D]; objek ini sendiri bisa dijumlahkan, dikali, atau dibandingkan dengan durasi lain.

Array Tanggal dan Konversi Unit #

Kekuatan sebenarnya muncul pada array. List string tanggal dapat dikonversi sekali, lalu seluruh operasi berjalan ter-vektorisasi:

python
import numpy as np

transaksi = np.array(["2026-10-01", "2026-10-05", "2026-10-12"], dtype="datetime64[D]")
print(transaksi.dtype)
print(transaksi + np.timedelta64(7, "D"))
print(transaksi.astype("datetime64[M]"))

Output yang Dihasilkan:

text
datetime64[D]
['2026-10-08' '2026-10-12' '2026-10-19']
['2026-10' '2026-10' '2026-10']

Bedah singkat:

  1. Baris 3: konversi list string dilakukan satu kali saat pembuatan array; hasilnya array datetime64[D].
  2. Baris 5: satu timedelta64 di-broadcast ke seluruh elemen — pola yang sama seperti aritmetika array biasa pada Chapter Pengenalan Broadcasting.
  3. Baris 6 (astype): konversi unit ke M memotong bagian hari, bukan membulatkan; 2026-10-12 menjadi 2026-10.

Hari Kerja dengan busday_count #

Untuk kebutuhan kalender kerja, NumPy menyediakan keluarga fungsi busday. Fungsi np.busday_count menghitung hari kerja (Senin-Jumat) dalam rentang tanggal, dan parameter holidays mengeluarkan tanggal libur tertentu:

python
import numpy as np

print(np.busday_count("2026-10-01", "2026-11-01"))
libur = ["2026-10-12", "2026-10-24"]
print(np.busday_count("2026-10-01", "2026-11-01", holidays=libur))
print(np.is_busday("2026-10-17"), np.is_busday("2026-10-18"))

Output yang Dihasilkan:

text
22
21
False False

Penjelasan:

  1. Baris 3: rentang "2026-10-01" sampai "2026-11-01" memuat 22 hari kerja; batas akhir bersifat eksklusif.
  2. Baris 5: dua tanggal libur yang jatuh pada hari kerja mengurangi hasil menjadi 21; libur yang jatuh pada akhir pekan tidak berefek.
  3. Baris 6 (np.is_busday): 2026-10-17 adalah Sabtu dan 2026-10-18 adalah Minggu, sehingga keduanya bukan hari kerja.

Perbedaan dengan datetime Python #

Aspekdatetime Pythondatetime64 NumPy
Penyimpananobjek penuh per nilaibilangan bulat 64-bit + unit
Operasi arrayloop Python, lambatter-vektorisasi
Presisimikrodetik, tetapdipilih per array, hingga nanodetik
Rentang amantahun 1-9999bergantung unit (unit halus mempersempit rentang)
Aritmetikadatetime.timedeltatimedelta64 dengan unit

Dengan datetime64 dan timedelta64 di tangan, data deret waktu dapat dihitung langsung di NumPy; bab-bab berikutnya memakai fondasi yang sama untuk data numerik yang bentuknya lebih bebas.

Mendeteksi NaT dengan np.isnat #

Nilai tanggal yang hilang diwakili NaT (Not a Time) — analogi NaN untuk datetime64. NaT muncul saat data sumber kosong atau hasil operasi tanggal tidak terdefinisi, dan perhitungan yang menyentuh NaT menghasilkan NaT pula. Fungsi np.isnat menguji setiap elemen dan mengembalikan mask boolean, sehingga tanggal kosong dapat dihitung sekaligus difilter secara ter-vektorisasi:

python
import numpy as np

kirim = np.array(
    ["2026-10-01", "NaT", "2026-10-04", "NaT", "2026-10-09"],
    dtype="datetime64[D]",
)
kosong = np.isnat(kirim)
print(kosong)
print("jumlah NaT:", np.sum(kosong))
print(kirim[~kosong])

Output yang Dihasilkan:

text
[False  True False  True False]
jumlah NaT: 2
['2026-10-01' '2026-10-04' '2026-10-09']

Penjelasan singkat:

  1. Baris 7 (np.isnat(kirim)): setiap elemen array diperiksa; elemen NaT menghasilkan True, elemen tanggal sah menghasilkan False.
  2. Baris 9 (np.sum(kosong)): True diperlakukan sebagai 1, sehingga penjumlahan mask langsung memberikan jumlah tanggal kosong, yaitu 2.
  3. Baris 10: mask dibalik dengan ~ untuk boolean indexing, sehingga hanya baris bertanggal sah yang tersisa; pola ini dibahas lebih dalam pada Chapter Boolean Indexing.

np.isnat juga menerima array timedelta64, dan mask hasilnya bisa dipakai untuk mengisi nilai ganti — misalnya mengganti tiap NaT dengan tanggal cadangan melalui np.where(kosong, ...) sebelum dihitung lebih lanjut.