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:
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:
2026-10-17 datetime64[D]
2026-10-17T00:00:00 datetime64[s]
2026-10-17T09:30Mari kita bedah:
- Baris 3 (
np.datetime64("2026-10-17")): string tanpa bagian jam membuat unit disimpulkan sebagaiD; nilainya tersimpan sebagai jumlah hari sejak acuan internal. - Baris 5 (
np.datetime64("2026-10-17", "s")): unit dipaksas(detik), dan pencetakan menunjukkan nilai yang dilengkapiT00:00:00— tanggal yang sama, presisi berbeda. - 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:
| Unit | Arti | Contoh penulisan string |
|---|---|---|
Y | tahun | "2026" |
M | bulan | "2026-10" |
D | hari | "2026-10-17" |
h | jam | "2026-10-17T09" |
m | menit | "2026-10-17T09:30" |
s | detik | "2026-10-17T09:30:15" |
ms | milidetik | "2026-10-17T09:30:15.500" |
ns | nanodetik | "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:
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:
2026-10-20
2026-10-17T12
16 days timedelta64[D]Penjelasan tiap baris:
- Baris 5:
datetime64unitDditambahtimedelta643 hari menghasilkan tanggal baru, masih berunitD. - Baris 6: penambahan 12 jam memaksa hasil naik ke presisi jam — terlihat dari format
T12pada hasil cetak. - Baris 7-8: pengurangan dua tanggal menghasilkan
16 daysbertipetimedelta64[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:
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:
datetime64[D]
['2026-10-08' '2026-10-12' '2026-10-19']
['2026-10' '2026-10' '2026-10']Bedah singkat:
- Baris 3: konversi list string dilakukan satu kali saat pembuatan array; hasilnya array
datetime64[D]. - Baris 5: satu
timedelta64di-broadcast ke seluruh elemen — pola yang sama seperti aritmetika array biasa pada Chapter Pengenalan Broadcasting. - Baris 6 (
astype): konversi unit keMmemotong bagian hari, bukan membulatkan;2026-10-12menjadi2026-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:
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:
22
21
False FalsePenjelasan:
- Baris 3: rentang
"2026-10-01"sampai"2026-11-01"memuat 22 hari kerja; batas akhir bersifat eksklusif. - Baris 5: dua tanggal libur yang jatuh pada hari kerja mengurangi hasil menjadi 21; libur yang jatuh pada akhir pekan tidak berefek.
- Baris 6 (
np.is_busday):2026-10-17adalah Sabtu dan2026-10-18adalah Minggu, sehingga keduanya bukan hari kerja.
Perbedaan dengan datetime Python #
| Aspek | datetime Python | datetime64 NumPy |
|---|---|---|
| Penyimpanan | objek penuh per nilai | bilangan bulat 64-bit + unit |
| Operasi array | loop Python, lambat | ter-vektorisasi |
| Presisi | mikrodetik, tetap | dipilih per array, hingga nanodetik |
| Rentang aman | tahun 1-9999 | bergantung unit (unit halus mempersempit rentang) |
| Aritmetika | datetime.timedelta | timedelta64 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:
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:
[False True False True False]
jumlah NaT: 2
['2026-10-01' '2026-10-04' '2026-10-09']Penjelasan singkat:
- Baris 7 (
np.isnat(kirim)): setiap elemen array diperiksa; elemenNaTmenghasilkanTrue, elemen tanggal sah menghasilkanFalse. - Baris 9 (
np.sum(kosong)):Truediperlakukan sebagai 1, sehingga penjumlahan mask langsung memberikan jumlah tanggal kosong, yaitu 2. - 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.