Lubridate: BC λ‚ μ§œ

에 λ§Œλ“  2009λ…„ 05μ›” 27일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: tidyverse/lubridate

자기 μžμ‹ μ„ κΈ°μ–΅ν•˜μ‹­μ‹œμ˜€: BC λ‚ μ§œμ™€ μ‹œκ°„μ„ κ³ λ €ν•˜μ‹­μ‹œμ˜€(κ·Έλ¦¬μŠ€λ„ 이전/ν†΅μš© μ‹œλŒ€ 이전)

  • κ°œλ ›

λͺ¨λ“  7 λŒ“κΈ€

μ•ˆλ…•. λ‚˜λŠ” 이것이 κ³ λŒ€λΌλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ 이 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으둜 인해 λ°œμƒν•˜λŠ” λ¬Έμ œμ— λŒ€ν•œ λͺ‡ 가지 생각이 μžˆμŠ΅λ‹ˆλ‹€.

(μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ) "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.

μ•„μš°κ΅¬μŠ€νˆ¬μŠ€ λ‚ μ§œλ₯Ό

  • μΆœμƒ: 기원전 63λ…„ 9μ›” 23일
  • 사망: μ„œκΈ° 14λ…„ 8μ›” 19일
  • 사망 μ—°λ Ή: 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)

λ”°λΌμ„œ μ˜¬λ°”λ₯Έ λ„μš°λ―Έ κΈ°λŠ₯은 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μ—μ„œ λ¬Έμ œκ°€ λ‹€μ‹œ 열릴 수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰