Timestamp pada chapter-chapter sebelumnya menjawab pertanyaan “kapan”, tetapi analisis nyata juga penuh pertanyaan “berapa lama”: berapa lama pesanan diproses, berapa hari jeda antarpembelian, atau berapa jam mesin berhenti. pandas menyimpan jawaban jenis ini dalam tipe timedelta64, sebuah durasi yang bisa dijumlahkan, dirata-rata, dan dibedah ke komponennya. Selisih dua Timestamp secara otomatis menghasilkan Timedelta, sehingga analisis durasi sering kali hanya berupa pengurangan sederhana diikuti pembacaan komponen. Chapter ini membahas pembuatan Timedelta lewat to_timedelta() dan konstruktor, aritmetika Timestamp dengan durasi, timedelta_range(), serta accessor .dt untuk mengekstrak hari dan total detik.

Membuat Timedelta #

Fungsi pd.to_timedelta() mengubah string durasi, angka, atau daftar campuran menjadi TimedeltaIndex atau Series durasi. Format string yang diterima cukup longgar: "1 days 03:00:00", "02:45:00", sampai singkatan seperti "30 min". Konstruktor pd.Timedelta(days=2, hours=5) adalah jalur eksplisit ketika durasi dibangun dari komponen numerik. Selisih dua Timestamp juga menghasilkan Timedelta tanpa perlu konversi apa pun, dan deret durasi beraturan bisa dibuat lewat pd.timedelta_range() seperti date_range() pada tanggal.

python
import pandas as pd

# Durasi dari string berformat bebas
durasi = pd.to_timedelta(["1 days 03:00:00", "02:45:00", "30 min", "2 days"])
print(durasi)

# Konstruksi langsung dan aritmetika dengan Timestamp
tambah = pd.Timedelta(days=2, hours=5)
print("\n2026-03-10 +", tambah, "=", pd.Timestamp("2026-03-10") + tambah)

# Selisih dua Timestamp menghasilkan Timedelta
dibuat = pd.Timestamp("2026-03-10 08:30:00")
kirim = pd.Timestamp("2026-03-11 14:45:00")
print("durasi pesanan:", kirim - dibuat)

# Deret durasi yang beraturan
jadwal = pd.timedelta_range(start="0h", periods=4, freq="45min")
print("\ntimedelta_range:", list(jadwal))

pesanan = pd.DataFrame(
    {
        "pesanan": ["P-101", "P-102", "P-103", "P-104"],
        "dibuat": pd.to_datetime(
            [
                "2026-03-02 09:00:00",
                "2026-03-02 15:20:00",
                "2026-03-03 11:05:00",
                "2026-03-04 16:40:00",
            ]
        ),
        "selesai": pd.to_datetime(
            [
                "2026-03-03 13:30:00",
                "2026-03-03 09:10:00",
                "2026-03-06 08:45:00",
                "2026-03-04 19:25:00",
            ]
        ),
    }
)
pesanan["durasi"] = pesanan["selesai"] - pesanan["dibuat"]
print("\n", pesanan)

print("\nkomponen hari:")
print(pesanan["durasi"].dt.days)

print("\ntotal detik:")
print(pesanan["durasi"].dt.total_seconds())

rata = pesanan["durasi"].mean()
print("\nrata-rata pemrosesan:", rata)
print("dalam jam:", rata.total_seconds() / 3600)

Output yang Dihasilkan:

text
TimedeltaIndex(['1 days 03:00:00', '0 days 02:45:00', '0 days 00:30:00',
                '2 days 00:00:00'],
               dtype='timedelta64[us]', freq=None)

2026-03-10 + 2 days 05:00:00 = 2026-03-12 05:00:00
durasi pesanan: 1 days 06:15:00

timedelta_range: [Timedelta('0 days 00:00:00'), Timedelta('0 days 00:45:00'), Timedelta('0 days 01:30:00'), Timedelta('0 days 02:15:00')]

   pesanan              dibuat             selesai          durasi
0   P-101 2026-03-02 09:00:00 2026-03-03 13:30:00 1 days 04:30:00
1   P-102 2026-03-02 15:20:00 2026-03-03 09:10:00 0 days 17:50:00
2   P-103 2026-03-03 11:05:00 2026-03-06 08:45:00 2 days 21:40:00
3   P-104 2026-03-04 16:40:00 2026-03-04 19:25:00 0 days 02:45:00

komponen hari:
0    1
1    0
2    2
3    0
Name: durasi, dtype: int64

total detik:
0    102600.0
1     64200.0
2    250800.0
3      9900.0
Name: durasi, dtype: float64

rata-rata pemrosesan: 1 days 05:41:15
dalam jam: 29.6875

Mari kita telaah baris-baris kuncinya:

  1. Baris 4-5: empat string durasi berformat berbeda dikonversi sekaligus menjadi TimedeltaIndex; semua nilai dinormalisasi ke satuan hari dan jam yang rapi.
  2. Baris 8-9: pd.Timestamp("2026-03-10") + tambah menggeser tanggal dua hari lima jam ke depan, membuktikan durasi bisa dijumlahkan langsung ke titik waktu.
  3. Baris 13-15: pengurangan kirim - dibuat menghasilkan Timedelta bernilai '1 days 06:30:00' tanpa fungsi tambahan apa pun.
  4. Baris 18-19: timedelta_range(start="0h", periods=4, freq="45min") membuat empat durasi berjarak 45 menit, pola yang sama dengan date_range().
  5. Baris 22-46: DataFrame pesanan mendapat kolom durasi dari selisih dua kolom datetime; hasilnya Series timedelta64 yang siap dibedah.

Membedah Durasi dengan Accessor .dt #

Series durasi punya accessor .dt seperti Series datetime. Properti .dt.days mengambil komponen hari penuh: pesanan yang selesai di hari yang sama bernilai 0, pesanan lewat satu hari bernilai 1, dan seterusnya. Method .dt.total_seconds() berbeda sifatnya karena mengubah seluruh durasi menjadi jumlah detik dalam float64, sehingga durasi 27 jam menjadi 97200.0 bukan 1 hari 3 jam. Untuk rata-rata durasi, mean() pada Series timedelta menghasilkan Timedelta rata-rata yang tetap bisa dibedah dengan .dt; mengonversinya ke jam dengan total_seconds() / 3600 membuat angka siap masuk laporan.

Aritmetika Durasi dalam Analisis #

Durasi bukan hanya hasil akhir; durasi ikut berpartisipasi dalam aritmetika. Menjumlahkan Timedelta ke kolom datetime menghasilkan kolom datetime baru — pola yang lazim untuk menghitung tanggal jatuh tempo dari tanggal transaksi ditambah masa kredit. Membagi Series durasi dengan durasi lain atau mengalikan dengan angka juga sah: durasi / pd.Timedelta(hours=1) menghasilkan jumlah jam dalam float, alternatif yang lebih ekspresif dibanding total_seconds() / 3600. Chapter diff sebelumnya sudah menyentuh selisih datetime yang menghasilkan timedelta; chapter ini melengkapinya dengan seluruh perangkat pembacaan dan manipulasi durasinya.

Dokumentasi resmi yang relevan: pandas.to_timedelta untuk format string yang diterima, User Guide: Time deltas yang merangkum seluruh operasi durasi, dan pandas.Timedelta untuk konstruktor beserta properti satuan. Sampai di sini kita menguasai titik waktu dan durasinya. Chapter berikutnya melengkapi kotak peralatan waktu dengan Period untuk rentang utuh seperti satu bulan, serta tz_localize dan tz_convert untuk bekerja dengan zona waktu.