Update README.md
This commit is contained in:
parent
a7a2b83b56
commit
567a61deac
105
README.md
105
README.md
@ -1,3 +1,106 @@
|
|||||||
# Readme.md
|
# Readme.md
|
||||||
|
|
||||||
Tanggal Yang Tak Pasti
|
Tanggal Yang Tak Pasti
|
||||||
|
Berikut adalah penjelasan lengkap dan detail tentang strategi dan implementasi dari fungsi evaluasi_tanggal :
|
||||||
|
Tujuan Fungsi
|
||||||
|
Fungsi evaluasi_tanggal() bertujuan untuk mengevaluasi setiap tanggal dalam daftar untuk menentukan apakah format tanggal tersebut ambigu atau tidak ambigu. Tanggal dianggap tidak ambigu ("YA") jika:
|
||||||
|
1. Tanggal tersebut mengandung nama bulan (misalnya, 23-mar-2000).
|
||||||
|
2. Format tanggalnya jelas dan tidak menimbulkan kebingungan dalam pengidentifikasian hari dan bulan (misalnya, 2011-08-22).
|
||||||
|
Sebaliknya, tanggal dianggap ambigu ("TIDAK") jika:
|
||||||
|
1. Tidak ada nama bulan dalam format teks.
|
||||||
|
2. Bagian hari dan bulan bisa saling tertukar atau tidak jelas (misalnya 04/05/2010, di mana 4 dan 5 bisa berarti bulan atau hari tergantung urutannya).
|
||||||
|
|
||||||
|
Strategi Umum
|
||||||
|
Fungsi ini memiliki beberapa langkah kunci untuk melakukan evaluasi tanggal:
|
||||||
|
1. Deteksi nama bulan:
|
||||||
|
o Jika tanggal mengandung nama bulan (misalnya mar untuk Maret), maka tanggal tersebut langsung dianggap tidak ambigu ("YA").
|
||||||
|
2. Validasi format tanggal:
|
||||||
|
o Tanggal yang tidak mengandung nama bulan akan diperiksa apakah sesuai dengan format yang dapat diparsing (dengan pemisah - atau /).
|
||||||
|
o Format yang benar adalah tiga bagian (hari, bulan, tahun) setelah dipecah.
|
||||||
|
3. Validasi tahun:
|
||||||
|
o Tahun diidentifikasi sebagai angka lebih besar dari 999. Jika tidak ditemukan angka yang lebih besar dari 999, tanggal tersebut dianggap tidak valid ("TIDAK").
|
||||||
|
4. Pengecekan ambiguitas:
|
||||||
|
o Jika bagian hari dan bulan keduanya bernilai ≤ 12, maka tanggal dianggap ambigu ("TIDAK"), karena kita tidak bisa memastikan mana yang hari dan mana yang bulan.
|
||||||
|
o Jika salah satu angka lebih besar dari 12, maka tanggal tersebut dianggap tidak ambigu ("YA"), karena kita bisa memastikan angka lebih besar adalah hari (misalnya, 13/02/1998).
|
||||||
|
|
||||||
|
Penjelasan Langkah demi Langkah dalam Kode
|
||||||
|
1. Mengimpor dan Memulai Fungsi
|
||||||
|
def evaluasi_tanggal(tanggal_list):
|
||||||
|
hasil = []
|
||||||
|
nama_bulan = ['jan', 'feb', 'mar', 'apr', 'may', 'jun',
|
||||||
|
'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
|
||||||
|
• nama_bulan adalah daftar singkatan nama bulan dalam bahasa Inggris.
|
||||||
|
• hasil akan menyimpan pasangan (tanggal, status) yang menunjukkan apakah tanggal tersebut ambigu atau tidak.
|
||||||
|
2. Mengevaluasi Setiap Tanggal
|
||||||
|
for tanggal in tanggal_list:
|
||||||
|
tgl_lower = tanggal.lower()
|
||||||
|
# Jika mengandung nama bulan
|
||||||
|
if any(bln in tgl_lower for bln in nama_bulan):
|
||||||
|
hasil.append((tanggal, "YA"))
|
||||||
|
continue
|
||||||
|
• Pengecekan nama bulan: Jika tanggal mengandung nama bulan (misalnya mar untuk Maret), maka langsung dianggap tidak ambigu ("YA").
|
||||||
|
3. Memproses Format Tanggal
|
||||||
|
parts = tanggal.replace("/", "-").split("-")
|
||||||
|
|
||||||
|
try:
|
||||||
|
parts_int = [int(p) for p in parts]
|
||||||
|
except ValueError:
|
||||||
|
hasil.append((tanggal, "TIDAK"))
|
||||||
|
continue
|
||||||
|
• Normalisasi pemisah: Tanggal diubah agar hanya menggunakan tanda - sebagai pemisah.
|
||||||
|
• Konversi menjadi integer: Setiap bagian (hari, bulan, tahun) diubah menjadi angka. Jika ada bagian yang tidak bisa diubah menjadi angka, tanggal dianggap tidak valid ("TIDAK").
|
||||||
|
4. Validasi Jumlah Bagian
|
||||||
|
if len(parts_int) != 3:
|
||||||
|
hasil.append((tanggal, "TIDAK"))
|
||||||
|
continue
|
||||||
|
• Tanggal harus terdiri dari tiga bagian (hari, bulan, tahun). Jika tidak, maka tanggal dianggap tidak valid.
|
||||||
|
5. Identifikasi Tahun
|
||||||
|
tahun = next((x for x in parts_int if x > 999), None)
|
||||||
|
if not tahun:
|
||||||
|
hasil.append((tanggal, "TIDAK"))
|
||||||
|
continue
|
||||||
|
• Identifikasi tahun: Tahun dipilih sebagai angka yang lebih besar dari 999 (karena tahun pasti lebih besar dari angka bulan atau hari). Jika tidak ditemukan, tanggal dianggap tidak valid.
|
||||||
|
6. Memisahkan Hari dan Bulan
|
||||||
|
lainnya = [x for x in parts_int if x != tahun]
|
||||||
|
|
||||||
|
# DEBUG PRINT
|
||||||
|
print(f"Evaluasi: {tanggal} -> lainnya: {lainnya}")
|
||||||
|
• lainnya: Menyimpan dua bagian lainnya (hari dan bulan) selain tahun.
|
||||||
|
7. Evaluasi Ambiguitas
|
||||||
|
if all(x <= 12 for x in lainnya):
|
||||||
|
hasil.append((tanggal, "TIDAK"))
|
||||||
|
else:
|
||||||
|
hasil.append((tanggal, "YA"))
|
||||||
|
• Pengecekan ambiguitas: Jika kedua angka selain tahun adalah ≤ 12, maka tanggal dianggap ambigu ("TIDAK"), karena kita tidak bisa memastikan mana yang hari dan mana yang bulan. Jika salah satu lebih besar dari 12, maka dianggap tidak ambigu ("YA").
|
||||||
|
8. Hasil Evaluasi
|
||||||
|
return hasil
|
||||||
|
• Mengembalikan daftar hasil evaluasi, yang berisi pasangan (tanggal, status).
|
||||||
|
|
||||||
|
Contoh Data Uji dan Hasil Evaluasi
|
||||||
|
Data Uji:
|
||||||
|
tanggal_data = [
|
||||||
|
"15/02/1998", # YA
|
||||||
|
"04/05/2010", # TIDAK
|
||||||
|
"1-3-2004", # TIDAK
|
||||||
|
"2011-08-22", # YA
|
||||||
|
"23-mar-2000", # YA
|
||||||
|
"04/07/2010", # TIDAK
|
||||||
|
"1965-3-4" # TIDAK
|
||||||
|
]
|
||||||
|
Hasil Evaluasi:
|
||||||
|
15/02/1998: YA
|
||||||
|
04/05/2010: TIDAK
|
||||||
|
1-3-2004: TIDAK
|
||||||
|
2011-08-22: YA
|
||||||
|
23-mar-2000: YA
|
||||||
|
04/07/2010: TIDAK
|
||||||
|
1965-3-4: TIDAK
|
||||||
|
|
||||||
|
Kesimpulan
|
||||||
|
Fungsi evaluasi_tanggal berhasil mendeteksi tanggal yang ambigu dan tidak ambigu berdasarkan:
|
||||||
|
1. Ada tidaknya nama bulan dalam teks.
|
||||||
|
2. Jika angka-angka dalam tanggal memungkinkan kebingungan antara hari dan bulan.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user