Lubridate: تواريخ قبل الميلاد

تم إنشاؤها على ٢٧ مايو ٢٠٠٩  ·  7تعليقات  ·  مصدر: tidyverse/lubridate

تذكر لنفسك: ضع في اعتبارك تواريخ ووقت قبل الميلاد (قبل المسيح / قبل العصر العام)

  • جاريت

ال 7 كومينتر

مرحبا. أعلم أن هذا قديم ، ولكن هل يفكر أي شخص في هذه المشكلة قبل الميلاد / قبل الميلاد ، أم هل يتعامل 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.

منذ إرجاع كائن تاريخ بسنة موجبة. ومع ذلك ، فإن الأعمال التالية:

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

مما جعلني أكتب دالة مساعدة تتعامل مع السنوات السلبية.

أستطيع أن أؤكد أنه بالنسبة لأي شخص يعمل في الفترات القديمة (مثل الفترات اليونانية والرومانية) ، ستكون هذه الميزة مفيدة للغاية. تعد هذه المشكلة / الاختيار حاليًا بمثابة كسر للصفقات لعشاق Tidyverse و lubridate باستخدام R في مشاريع ودورات العلوم الإنسانية الرقمية. يسعدني اختبار الوظائف المعدلة.

مرحبا! شكرا على الحزمة والعمل المنجز. إذا اعتبر شخص ما تنفيذ تواريخ BCE ، أو التعامل مع أولئك الذين لديهم الحزمة كما هو (1.7.9) ، فإليك بعض الأفكار حول المشكلات التي تسببها السنة الوهمية صفر.

التعامل مع (غير الموجودة) "السنة صفر"

تفسيرات

إذا كان أي شخص يفكر في التعامل مع تواريخ "ما قبل العصر المشترك" في lubridate ، فكن على دراية بأن السنة صفر غير موجودة (أعني بالنسبة للمؤرخين ، هناك السنة -1 ثم السنة 1 ، انظر على سبيل المثال التسلسل الزمني لـ Wikipedia - لاحظ أيضًا أن هذا بالنسبة للتقويم اليولياني ، قد يكون لذلك تعارض طفيف مع التقويم الغريغوري الذي نستخدمه في الوقت الحاضر ؛ ستجد المزيد من التفاصيل حول هذا على ويكيبيديا) ، وقد يتسبب ذلك في بعض المشاكل.

توضيح سريع للأشخاص الذين ليسوا على دراية بهذه الرموز:

  • يرمز الحرف " CE " إلى "العصر العام" ، وهو "إزالة المسيحية" من كلمة "AD" الطويلة والتي لا تزال مستخدمة ، "Anno Domini" (لذلك يمكن اعتبار التواريخ CE "سنوات إيجابية")
  • يرمز " BCE " إلى "Before Common Era" ، أي ما يعادل "BC" ، "قبل المسيح" ("السنوات السلبية").
    على سبيل المثال توفي سقراط عام 399 قبل الميلاد.

على سبيل المثال ، يتبع lubridate ISO 8601 (الإصدار 8601: 2004 أفترض أنه يمكن التعامل مع تواريخ BCE باستخدام ISO 8601: 2019 ولكن جزء الوصول المجاني من المستند غير واضح بشأنه) ، والذي يبدأ من 0000-01-01 ، هذا هو الأول من يناير من 1 قبل الميلاد (السنة -1).

هذه الكتابة محيرة لأنها تترك للاعتقاد أن " 0000-01-01 " هي السنة 0 ، وأن " -001-01-01 " هي السنة -1 عندما تكون السنة -2 ، ويمكن أن تسبب مشاكل في حساب المدد ( انظر رمز أدناه ).

وبغض النظر عن ذلك ، إذا تمت مواجهته ، فمن المحتمل أن يتم تحليل "0 م / م" أو "0 قبل الميلاد / قبل الميلاد" في السنة -1.

المراجع: ويكيبيديا ( ISO 8601 ، السنة صفر ، 1 قبل الميلاد ، العصر المشترك ...)

بعض التعليمات البرمجية لتوضيح وجهة نظري

(مرخص بموجب 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.

دعنا نوضح مع تواريخ أغسطس :

  • الميلاد: 23 سبتمبر 63 قبل الميلاد
  • الوفاة: 19 أغسطس 14 م
  • العمر عند الوفاة: 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 لتاريخ قبل الميلاد مع سنة واحدة أقل (أقل في القيمة المطلقة ، أي قبل عام واحد هنا) من "الحقيقية" ، كما لو كانت سنة الصفر موجودة ، وهو أمر مضلل.

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

في ضوء التعليقات الأخيرة (والاستخدام الواسع لحزم R و Tidyverse في مشاريع العلوم الإنسانية الرقمية) ، هل تعتقد أنه يمكن إعادة فتح المشكلة ،vspinu؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات