μκΈ° μμ μ κΈ°μ΅νμμμ€: BC λ μ§μ μκ°μ κ³ λ €νμμμ€(그리μ€λ μ΄μ /ν΅μ© μλ μ΄μ )
μλ . λλ μ΄κ²μ΄ κ³ λλΌλ κ²μ μκ³ μμ§λ§ μ΄ bce / bc λ¬Έμ μ λν΄ μκ°νλ μ¬λμ΄ μμ΅λκΉ, μλλ©΄ lubridateκ° μ΄μ μ΄κ²μ κΈ°λ³Έμ μΌλ‘ μ²λ¦¬ν©λκΉ?
λ ꡬ체μ μΌλ‘ 무μμ΄ λ¬Έμ μΈκ°. μ¬λλ€μ΄ μΌλμ λκ³ μλ μ¬μ©μ ν¨ν΄μ 무μμ λκΉ?
λλ μ΄κ²μ λ«λλ€. λκ΅°κ° μ΄ μμ μ μνν΄μΌ νκ³ μ μ©νλ€κ³ μ£Όμ₯νλ©΄ λ€μ μ΄μ΄μ£ΌμΈμ.
κΈμ, λ΄κ° μ΄κ²μ μ κΈ°μ μΌλ‘ μ¬μ©νλ κ²μ μλμ§λ§ μμ μ°λ, μ¦ BCκ° ν¬ν¨λ λ°μ΄ν° μΈνΈμμ μμ νμΌλ©° μ²λ¦¬νλ λ° μλΉν μ΄λ €μμ΄ μμμ΅λλ€. μλ₯Ό λ€μ΄ λ€μμ μλνμ§ μμ΅λλ€.
> 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.
μμ μ°λκ° μλ Date κ°μ²΄κ° λ°νλκΈ° λλ¬Έμ λλ€. μ¦, λ€μμ΄ μλν©λλ€.
> lubridate::ymd("0000-01-01") - lubridate::years(2255)
[1] "-2255-01-01"
μμλ₯Ό μ²λ¦¬νλ λμ°λ―Έ ν¨μλ₯Ό μμ±νκ² νμ΅λλ€.
κ³ λ μλ(μ: κ·Έλ¦¬μ€ λ° λ‘λ§ μλ)μ λν΄ μμ
νλ λͺ¨λ μ¬λμκ² μ΄ κΈ°λ₯μ΄ λ§€μ° μ μ©ν κ²μμ νμΈν μ μμ΅λλ€. μ΄ λ¬Έμ /μ νμ νμ¬ λμ§νΈ μΈλ¬Έν νλ‘μ νΈ λ° κ³Όμ μμ Rμ μ¬μ©νλ Tidyverse λ° lubridate
μ νΈκ°λ₯Ό μν κ±°λ μ°¨λ¨κΈ°μ
λλ€. μμ λ κΈ°λ₯μ ν
μ€νΈν΄ λ³΄κ³ μΆμ΅λλ€.
μλ ! ν¨ν€μ§μ μμ μ κ°μ¬λ립λλ€. λκ΅°κ° BCE λ μ§λ₯Ό ꡬννκ±°λ ν¨ν€μ§λ₯Ό μλ κ·Έλλ‘ μ²λ¦¬νλ κ²μ κ³ λ €νλ κ²½μ°(1.7.9), ν¬ν μ°λ 0μΌλ‘ μΈν΄ λ°μνλ λ¬Έμ μ λν λͺ κ°μ§ μκ°μ΄ μμ΅λλ€.
μ¬λμ λ€λ£¨λ κ³ λ €νλ©΄ lubridateμ λ μ§ "μΌλ°μ μΈ μλ μ΄μ "μ¬ν΄ μ λ‘κ° μ‘΄μ¬νμ§ μλ μ μ μ μ (λ΄ λ§μ μμ¬λ₯Ό μν΄, μλ₯Ό λ€μ΄, μ°Έμ‘°, λ€μ λ λ -1κ³Ό 1 λ μ΄ μν€ λ°±κ³Όμ μ°λκΈ°λ₯Ό λνμμ£Όμ - μ¨λ¦¬μ°μ€λ ₯μ κ²½μ° μ€λλ μ°λ¦¬κ° μ¬μ©νλ κ·Έλ κ³ λ¦¬λ ₯κ³Ό μ½κ°μ μΆ©λμ΄ μμ μ μμΌλ©° μ΄μ λν μμΈν λ΄μ©μ Wikipediaμμ μ°Ύμ μ μμ΅λλ€. λͺ κ°μ§ λ¬Έμ κ° λ°μν μ μμ΅λλ€.
ν΄λΉ νκΈ°λ²μ μ΅μνμ§ μμ μ¬λλ€μ μν λΉ λ₯Έ μ€λͺ :
- " CE "λ "Common Era"λ₯Ό λνλ΄λ©°, μ΄λ μ€λ«λμ μ¬μ©λ "AD", "Anno Domini"μ "λΉκΈ°λ κ΅ν"μ λλ€(λ°λΌμ CE λ μ§λ "κΈμ μ μΈ ν΄"λ‘ λ³Ό μ μμ)
- " BCE "λ "Before Common Era"λ₯Ό μλ―Ένλ©° "BC", "Before Christ"("μμ λ ")μ ν΄λΉν©λλ€.
μλ₯Ό λ€μ΄ μν¬λΌν μ€λ κΈ°μμ 399λ μ μ¬λ§νμ΅λλ€.
μλ₯Ό λ€μ΄, lubridateλ 0000-01-01
μμ μμνλ ISO 8601(λ²μ 8601:2004λ‘ μΆμ ν©λκΉ? BCE λ μ§ λ ISO 8601:2019 λ‘ μ²λ¦¬ . , μ¦ κΈ°μμ 1λ
(-1λ
)μ 1μ 1μΌμ
λλ€.
μ΄ μκ°νλ μ λλ¬Έμ μ°κΈ°λ νΌλ " 0000-01-01
"μ¬ν΄ 0, κ·Έλ¦¬κ³ "μ΄λ€ -001-01-01
"-1 λμ λ
-2 λ
μ΄λ©°, κ³μ° κΈ°κ°μ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€ ( μλ μ½λ ).
κ·Έ μΈμ "0 CE/AD" λλ "0 BCE/BC"κ° λ°μνλ©΄ μλ§λ -1λ μΌλ‘ ꡬ문 λΆμλμ΄μΌ ν©λλ€.
μ°Έμ‘°: Wikipedia( ISO 8601 , 0 λ , ν΅μ© μλ ...)
(WTFPL λΌμ΄μ μ€: μνλ λλ‘ νμΈμ)
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.
μμ°κ΅¬μ€ν¬μ€ λ μ§λ₯Ό
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)
λ°λΌμ μ¬λ°λ₯Έ λμ°λ―Έ κΈ°λ₯μ 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!
κ·Έλλ lubridateλ λ§μΉ 0λ μ΄ μ‘΄μ¬νλ κ²μ²λΌ BCE λ μ§λ₯Ό "μ€μ λ μ§"λ³΄λ€ 1λ μ κ²(μ λκ°μΌλ‘ λ μ μ, μ¬κΈ°μ 1λ μ) μΈμν©λλ€. μ΄λ μ€ν΄μ μμ§κ° μμ΅λλ€.
aug_birth
#> [1] "-062-09-23"
λ§μ§λ§ μ견(κ·Έλ¦¬κ³ λμ§νΈ μΈλ¬Έν νλ‘μ νΈμμ R λ° Tidyverse ν¨ν€μ§μ κ΄λ²μν μ¬μ©)μ κ³ λ €ν λ @vspinuμμ λ¬Έμ κ° λ€μ μ΄λ¦΄ μ μλ€κ³ μκ°νμλκΉ?