Lubridate: tanggal sebelum masehi

Dibuat pada 27 Mei 2009  ·  7Komentar  ·  Sumber: tidyverse/lubridate

Ingatlah untuk diri sendiri: pertimbangkan tanggal dan waktu SM (Sebelum Masehi/Sebelum Masehi)

  • Garrett

Semua 7 komentar

Hai. Saya tahu ini kuno, tetapi apakah ada yang memikirkan masalah bce / bc ini, atau apakah lubridate sekarang menangani ini secara asli?

Apa masalahnya lebih konkret. Apa pola pengguna yang ada dalam pikiran orang?

Saya menutup ini. Jika seseorang bersikeras bahwa ini harus dilakukan dan bermanfaat, silakan buka kembali.

Yah, bukan karena saya menggunakan ini secara teratur tetapi saya hanya mengerjakan kumpulan data yang memiliki tahun negatif yaitu, BC, disertakan dan memiliki beberapa kesulitan untuk menghadapinya. Misalnya yang berikut ini tidak berfungsi:

> lubridate::ymd("-2255-01-01")
[1] "2255-01-01"

> lubridate::parse_date_time(-2255, "Y")
[1] NA
Warning message:
All formats failed to parse. No formats found.

sejak objek Tanggal dengan tahun positif dikembalikan. Yang mengatakan, berikut ini berfungsi:

> lubridate::ymd("0000-01-01") - lubridate::years(2255)
[1] "-2255-01-01"

yang membuat saya menulis fungsi pembantu yang berhubungan dengan tahun-tahun negatif.

Saya dapat mengkonfirmasi bahwa bagi siapa saja yang bekerja pada periode kuno (misalnya periode Yunani dan Romawi) fitur ini akan sangat berguna. Masalah/pilihan ini saat ini merupakan pemecah kesepakatan untuk Tidyverse dan penggemar lubridate menggunakan R dalam proyek dan kursus Digital Humaniora. Saya akan dengan senang hati menguji fungsi yang dimodifikasi.

Hai! Terima kasih atas paket dan pekerjaannya. Jika seseorang mempertimbangkan untuk menerapkan tanggal BCE, atau berurusan dengan paket apa adanya (1.7.9), berikut adalah beberapa pemikiran tentang masalah yang disebabkan oleh tahun hantu nol.

Berurusan dengan (tidak ada) "Tahun nol"

penjelasan

Jika ada yang mempertimbangkan untuk berurusan dengan tanggal "sebelum era umum" dalam pelumas, ketahuilah bahwa Tahun nol tidak ada (untuk sejarawan maksud saya, ada Tahun -1 dan kemudian Tahun 1, lihat misalnya kronologi Wikipedia - juga perhatikan bahwa itu untuk kalender Julian, yang mungkin memiliki konflik kecil dengan kalender Gregorian yang kita gunakan saat ini; Anda akan menemukan detail lebih lanjut tentang ini di Wikipedia), dan itu dapat menyebabkan beberapa masalah.

Klarifikasi cepat untuk orang yang tidak terbiasa dengan notasi tersebut:

  • " CE " adalah singkatan dari "Common Era", yang merupakan "de-kristenisasi" dari "AD" yang lama dan masih digunakan, "Anno Domini" (jadi tanggal CE dapat dilihat sebagai "tahun positif")
  • " SM " adalah singkatan dari "Sebelum Era Umum", setara dengan "SM", "Sebelum Kristus" ("tahun-tahun negatif").
    misalnya. Socrates meninggal pada 399 SM.

Misalnya, pelumas mengikuti ISO 8601 (saya kira versi 8601:2004 ? Tanggal BCE dapat ditangani dengan ISO 8601:2019 tetapi bagian akses gratis dari dokumen tidak jelas tentangnya), yang dimulai dari 0000-01-01 , yaitu tanggal 1 Januari 1 SM (Tahun -1).

Tulisan ini membingungkan karena meninggalkan pemikiran " 0000-01-01 " adalah Tahun 0, dan bahwa " -001-01-01 " adalah Tahun -1 ketika Tahun -2, dan dapat menyebabkan masalah untuk menghitung durasi ( lihat kode di bawah ).

Selain itu, jika ditemui, "0 CE/AD" atau "0 BCE/BC" mungkin harus diuraikan ke Tahun -1.

Referensi: Wikipedia ( ISO 8601 , Tahun nol , 1 SM , Era Umum ...)

Beberapa kode untuk menjelaskan maksud saya

(Berlisensi di bawah WTFPL: Lakukan Apa yang Anda Inginkan)

pacman::p_load(lubridate)
pacman::p_version(lubridate)
#> [1] '1.7.9'

a <- ymd("0001-01-01")
a
#> [1] "0001-01-01"
# Year 1, no problem

b <- ymd("0000-01-01") - years(1)
b
#> [1] "-001-01-01"
# It is Year -1?
# No, it's -2 even if printed (-001-01-01),
# since ymd("0000-01-01") is already Year -1.

# The problem appears if we compute duration between the two
as.duration(a - b)
#> [1] "63158400s (~2 years)"
# But there is only one year between 1st January -1 and 1st January 1!
# since year zero doesn't exist.

Mari kita ilustrasikan dengan tanggal Augustus :

  • lahir: 23 September 63 SM
  • kematian: 19 Agustus 14 CE
  • usia saat meninggal: 75
aug_birth <- ymd("0000-09-23") - years(63)
aug_death <- ymd("0014-08-19")
age <- aug_death - aug_birth
as.duration(age)
#> [1] "2426889600s (~76.9 years)"
# That's one year too much!

# The correct writing would be:
aug_birth <- ymd("0000-09-23") - years(63 - 1)

Jadi fungsi pembantu yang benar adalah, untuk mengurai BCE yyyy-mm-dd:

parse_bce_ymd <- function(str) {
  regex <- "(\\d{4})(-\\d{2}-\\d{2})"
  match <- stringr::str_match(str, regex)
  years_n <- readr::parse_number(match[, 2]) - 1 # Beware the -1 here
  right_side <- match[, 3]
  date <- ymd(paste0("0000-",right_side)) - years(years_n)
  return(date)
}
# Test the function.
aug_birth <- parse_bce_ymd("0063-09-23")
aug_death <- ymd("0014-08-19")
age <- aug_death - aug_birth
as.duration(age)
#> [1] "2395353600s (~75.9 years)"
# Yay that's correct!

Namun, lumasi cetak tanggal BCE dengan satu tahun lebih sedikit (kurang dalam nilai absolut, yaitu satu tahun ke depan di sini) daripada "yang asli", seolah-olah ada tahun nol, yang menyesatkan.

aug_birth
#> [1] "-062-09-23"

Mengingat komentar terakhir (dan meluasnya penggunaan paket R dan Tidyverse dalam proyek humaniora digital), apakah menurut Anda masalah ini dapat dibuka kembali, @vspinu?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

gavinsimpson picture gavinsimpson  ·  27Komentar

sebschub picture sebschub  ·  7Komentar

DulceC picture DulceC  ·  5Komentar

awfrankwils picture awfrankwils  ·  7Komentar

courtiol picture courtiol  ·  6Komentar