العمل مع التواريخ في R (الإمكانيات الأساسية، بالإضافة إلى حزم lubridate وtimeperiodsR)

احصل على التاريخ الحالي بأي لغة برمجة، وهي عملية تعادل "Hello World!" لغة R ليست استثناء.

في هذه المقالة، سننظر في كيفية عمل العمل مع التواريخ في بناء الجملة الأساسي للغة R، وسننظر أيضًا في العديد من الحزم المفيدة التي تعمل على توسيع قدراتها عند العمل مع التواريخ:

  • lubridate - حزمة تسمح لك بإجراء العمليات الحسابية بين التواريخ؛
  • timeperiodsR — حزمة للعمل مع الفترات الزمنية ومكوناتها.

العمل مع التواريخ في R (الإمكانيات الأساسية، بالإضافة إلى حزم lubridate وtimeperiodsR)

محتوى

إذا كنت مهتمًا بتحليل البيانات، وعلى وجه الخصوص لغة R، فقد تكون مهتمًا بتحليلي تيليجرام и موقع YouTube القنوات. معظم محتوياته مخصص للغة R.

  1. العمل مع التواريخ في بناء جملة R الأساسي
    1.1 تحويل النص إلى التاريخ
    1.2 استخراج مكونات التاريخ في R الأساسية
  2. العمل مع التمور باستخدام حزمة اللوبريديت
    2.1 تحويل النص إلى تاريخ باستخدام lubridate
    2.2 استخراج مكونات التمر باستخدام عبوة اللوبريدات
    2.3 العمليات الحسابية مع التواريخ
  3. عمل مبسط مع الفترات، وحزمة timeperiodsR
    3.1 الفواصل الزمنية في فترات زمنيةR
    3.2 تصفية متجه التواريخ باستخدام timeperiodR
  4. اختتام

العمل مع التواريخ في بناء جملة R الأساسي

تحويل النص إلى التاريخ

يحتوي Basic R على مجموعة من الوظائف للعمل مع التواريخ. عيب بناء الجملة الأساسي هو أن حالة أسماء الوظائف والوسائط متناثرة للغاية وليس لها أي اتصال منطقي عمليًا. ومع ذلك، عليك أن تعرف الوظائف الأساسية للغة، لذلك سنبدأ بها.

في أغلب الأحيان، عند تحميل البيانات إلى R، من ملفات CSV، أو مصادر أخرى، تتلقى تاريخًا كنص. لتحويل هذا النص إلى نوع البيانات الصحيح، استخدم الدالة as.Date().

# создаём текстовый вектор с датами
my_dates <- c("2019-09-01", "2019-09-10", "2019-09-23")

# проверяем тип данных
class(my_dates)

#> [1] "character"

# преобразуем текст в дату
my_dates <- as.Date(my_dates)

# проверяем тип данных
class(my_dates)

#> [1] "Date"

بشكل افتراضي as.Date() يقبل التاريخ بتنسيقين: السنة-الشهر-اليوم أو سنة/شهر/يوم.
إذا كانت مجموعة البيانات الخاصة بك تحتوي على تواريخ بتنسيق آخر، فيمكنك استخدام الوسيطة format.

as.Date("September 26, 2019", format = "%B %d, %Y")

شكل يقبل العوامل في شكل سلسلة تشير إلى أي فاصل زمني وتنسيقه، وتظهر القيم الأكثر استخدامًا في الجدول أدناه:

شكل
وصف

%d
رقم اليوم في الشهر

%a
اختصار لاسم يوم من أيام الأسبوع

%A
الاسم الكامل ليوم الأسبوع

%w
عدد أيام الأسبوع (0-6، حيث 0 هو يوم الأحد)

%m
تعيين الشهر المكون من رقمين (01-12)

%b
اختصار اسم الشهر (أبريل، مارس، …)

%B
اسم الشهر بالكامل

%y
تعيين سنة مكونة من رقمين

%Y
تسمية السنة المكونة من أربعة أرقام

%j
رقم اليوم في السنة (001 - 366)

%U
رقم الأسبوع في السنة (00 - 53)، بداية الأسبوع الأحد

%W
رقم الأسبوع في السنة (00 - 53)، بداية الأسبوع الإثنين

وعليه فإن "26 سبتمبر 2019" هو الاسم الكامل للشهر والتاريخ والسنة. يمكن وصف تنسيق التاريخ هذا باستخدام عوامل التشغيل كما يلي:"%B %d, %Y".

حيث:

  • %B - اسم الشهر كاملا
  • %d - عدد اليوم في الشهر
  • %Y - تسمية السنة المكونة من أربعة أرقام

عند وصف تنسيق التاريخ، من المهم تضمين كافة الأحرف الإضافية من السلسلة، مثل الشرطات والفواصل والنقاط والمسافات وما إلى ذلك. في مثالي، "26 سبتمبر 2019"، هناك فاصلة بعد التاريخ، وتحتاج أيضًا إلى وضع فاصلة في وصف التنسيق:"%B %d, %Y".

هناك مواقف عندما تتلقى تاريخًا لا يتوافق مع التنسيقات القياسية فقط (YYYY-MM-DD أو YYYY/MM/DD)، ولكن أيضًا بلغة تختلف عن اللغة الافتراضية المثبتة على نظام التشغيل الخاص بك. على سبيل المثال، قمت بتنزيل البيانات حيث يُشار إلى التاريخ على النحو التالي: "15 ديسمبر 2019". قبل تحويل هذه السلسلة إلى تاريخ، تحتاج إلى تغيير اللغة.

# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")

استخراج مكونات التاريخ في R الأساسية

لا توجد العديد من الوظائف في R الأساسية التي تسمح لك باستخراج أي جزء من التاريخ من كائن فئة التاريخ.

current_date <- Sys.Date() # текущая дата
weekdays(current_date)     # получить номер дня недели
months(current_date)       # получить номер месяца в году
quarters(current_date)     # получить номер квартала в году

بالإضافة إلى فئة الكائن الرئيسي التاريخ يوجد في R الأساسي نوعان من البيانات يخزنان طابعًا زمنيًا: بوسيكسلت, POSIXct. الفرق الرئيسي بين هذه الفئات و التاريخ هو أنه بالإضافة إلى التاريخ الذي يقومون بتخزين الوقت.

# получить текущую дату и время
current_time <- Sys.time()

# узнать класс объекта current_time 
class(current_time)

# "POSIXct" "POSIXt"

وظيفة Sys.time() إرجاع التاريخ والوقت الحاليين بالتنسيق POSIXct. وهذا التنسيق مشابه في المعنى يونيكستيم، ويخزن عدد الثواني منذ بداية عصر UNIX (منتصف الليل (التوقيت العالمي المنسق) من 31 ديسمبر 1969 إلى 1 يناير 1970).

فئة بوسيكسلت كما يقوم بتخزين الوقت والتاريخ وجميع مكوناتهما. لذلك، فهو كائن ذو بنية أكثر تعقيدًا، ولكن من السهل الحصول على أي مكون للتاريخ والوقت لأنه في الحقيقة بوسيكسلت هذا قائمة.

# Получаем текущую дату и время
current_time_ct <- Sys.time()

# Преобразуем в формат POSIXlt
current_time_lt <- as.POSIXlt(current_time_ct)

# извлекаем компоненты даты и времени
current_time_lt$sec   # секунды
current_time_lt$min   # минуты
current_time_lt$hour  # часы
current_time_lt$mday  # день месяца
current_time_lt$mon   # месяц
current_time_lt$year  # год
current_time_lt$wday  # день недели
current_time_lt$yday  # день года
current_time_lt$zone  # часовой пояс

تحويل البيانات الرقمية والنصية إلى صيغ بوسيكس* تنفذها وظائف as.POSIXct() и as.POSIXlt(). تحتوي هذه الوظائف على مجموعة صغيرة من الوسائط.

  • x — رقم أو سلسلة أو كائن فئة التاريخ، والتي تحتاج إلى تحويل؛
  • tz — المنطقة الزمنية، الافتراضي "GMT"؛
  • التنسيق - وصف تنسيق التاريخ الذي يتم فيه تمثيل البيانات التي تم تمريرها إلى الوسيطة x؛
  • Origin - يستخدم فقط عند تحويل رقم إلى POSIX؛ يجب عليك تمرير كائن التاريخ والوقت الذي يتم حساب الثواني منه في هذه الوسيطة. يُستخدم عادةً للترجمة من UNIXTIME.

إذا كانت معلومات التاريخ والوقت موجودة يونيكستيم، ثم لتحويلها إلى تاريخ واضح ومقروء استخدم المثال التالي:

# Конвертируем UNIXTIME в читаемую дату 
as.POSIXlt(1570084639,  origin = "1970-01-01")

في الأصل يمكنك تحديد أي طابع زمني. على سبيل المثال، إذا كانت بياناتك تحتوي على التاريخ والوقت كعدد الثواني منذ 15 سبتمبر 2019 الساعة 12:15 مساءً، لتحويلها إلى تاريخ استخدم:

# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123,  origin = "2019-09-15 12:15:00")

العمل مع التمور باستخدام حزمة اللوبريديت

lubridate ربما هي الحزمة الأكثر شيوعًا للعمل مع التواريخ بلغة R. فهي توفر لك ثلاث فئات إضافية.

  • الفترات - المدة، أي عدد الثواني بين طابعين زمنيين؛
  • الفترات - تتيح لك الفترات إجراء حسابات بين التواريخ في فترات زمنية يمكن للإنسان قراءتها: الأيام والأشهر والأسابيع وما إلى ذلك؛
  • الفواصل الزمنية - الكائنات التي توفر نقطة البداية والنهاية في الوقت المناسب.

يتم تثبيت الحزم الإضافية بلغة R باستخدام الوظيفة القياسية install.packages().

تثبيت الحزمة lubridate:

install.packages("lubridate")

تحويل النص إلى تاريخ باستخدام lubridate

ميزات الحزمة lubridate تبسيط عملية تحويل النص إلى تاريخ بشكل كبير، وتسمح لك أيضًا بإجراء أي عمليات حسابية مع التواريخ والأوقات.

ستساعدك الوظائف في الحصول على التاريخ الحالي أو التاريخ والوقت today() и now().

today() # текущая дата
now()   # текущая дата и время

لتحويل سلسلة إلى تاريخ في lubridate هناك مجموعة كاملة من الوظائف التي تتكون أسماؤها دائمًا من ثلاثة أحرف، وتشير إلى تسلسل مكونات التاريخ:

  • ذ - سنة
  • م - شهر
  • د - يوم

قائمة الوظائف لتحويل النص إلى تاريخ عبر lubridate

  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

بعض الأمثلة لتحويل السلاسل إلى تواريخ:

ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")

كما ترون lubridate وهو أكثر فعالية في التعرف على أوصاف التاريخ كنص، ويسمح لك بتحويل النص إلى تاريخ دون استخدام عوامل تشغيل إضافية لوصف التنسيق.

استخراج مكونات التمر باستخدام عبوة اللوبريدات

باستخدام أيضا lubridate يمكنك الحصول على أي مكون من التاريخ:

dt <- ymd("2017 jan 21")

year(dt)  # год
month(dt) # месяц
mday(dt)  # день в месяце
yday(dt)  # день в году
wday(dt)  # день недели

العمليات الحسابية مع التواريخ

لكن الوظيفة الأكثر أهمية والأساسية lubridate هي القدرة على إجراء العمليات الحسابية المختلفة مع التواريخ.

يتم تنفيذ تقريب التاريخ من خلال ثلاث وظائف:

  • floor_date - التقريب إلى أقرب زمن الماضي
  • ceiling_date - التقريب إلى زمن المستقبل القريب
  • round_date - التقريب إلى أقرب وقت

كل من هذه الوظائف لديها حجة وحدةوالذي يسمح لك بتحديد وحدة التقريب: الثانية، الدقيقة، الساعة، اليوم، الأسبوع، الشهر، نصف الشهر، الربع، الموسم، نصف السنة، السنة

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # округлить до месяца
round_date(dt, unit = "3 month")  # округлить до 3 месяцев
round_date(dt, unit = "quarter")  # округлить до квартала
round_date(dt, unit = "season")   # округлить до сезона
round_date(dt, unit = "halfyear") # округлить до полугодия

لذلك دعونا نتعرف على كيفية الحصول على تاريخ يقع بعد 8 أيام من التاريخ الحالي وإجراء عمليات حسابية مختلفة بين التاريخين.

today() + days(8)   # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2)  # какая дата была 2 года назад

عمل مبسط مع الفترات، وحزمة timeperiodsR.

timeperiodsR - حزمة جديدة للعمل مع التواريخ تم نشرها على CRAN في سبتمبر 2019.

تثبيت الحزمة timeperiodsR:

install.packages("timeperiodsR")

والغرض الرئيسي هو تحديد فترة زمنية معينة بسرعة بالنسبة لتاريخ معين. على سبيل المثال، باستخدام وظائفه يمكنك بسهولة:

  • احصل على الأسبوع أو الشهر أو الربع أو العام الماضي في R.
  • احصل على عدد محدد من الفترات الزمنية المتعلقة بتاريخ ما، على سبيل المثال الأسابيع الأربعة الماضية.
  • ومن السهل استخراج مكوناته من الفاصل الزمني الناتج: تاريخ البداية والانتهاء، عدد الأيام المتضمنة في الفاصل الزمني، تسلسل التواريخ المتضمن فيه بالكامل.

اسم جميع وظائف الحزمة timeperiodsR بديهية وتتكون من جزأين: اتجاه_الفاصلةحيث:

  • اتجاه حيث تحتاج إلى التحرك بالنسبة إلى تاريخ معين: last_n، السابق، هذا، التالي، next_n.
  • مؤقت الفاصلة لحساب الفترة: اليوم، الأسبوع، الشهر، الربع، السنة.

مجموعة الميزات الكاملة:

  • last_n_days()
  • last_n_weeks()
  • last_n_months()
  • last_n_quarters()
  • last_n_years()
  • previous_week()
  • previous_month()
  • previous_quarter()
  • previous_year()
  • this_week()
  • this_month()
  • this_quarter()
  • this_year()
  • next_week()
  • next_month()
  • next_quarter()
  • next_year()
  • next_n_days()
  • next_n_weeks()
  • next_n_months()
  • next_n_quarters()
  • next_n_years()
  • custom_period()

الفواصل الزمنية في فترات زمنيةR

تعتبر هذه الوظائف مفيدة في الحالات التي تحتاج فيها إلى إنشاء تقارير بناءً على بيانات من الأسبوع أو الشهر الماضي. للحصول على الشهر الأخير، استخدم الدالة التي تحمل الاسم نفسه previous_month():

prmonth <- previous_month()

وبعد ذلك سيكون لديك كائن com.prmonth فئة نظام الحماية المؤقتوالتي يمكن من خلالها الحصول بسهولة على المكونات التالية:

  • تاريخ بداية الفترة، في مثالنا هذا هو الشهر الأخير
  • تاريخ نهاية الفترة
  • عدد الأيام المتضمنة في الفترة
  • تسلسل التواريخ المدرجة في الفترة

علاوة على ذلك، يمكنك الحصول على كل مكون من المكونات بطرق مختلفة:

# первый день периода
prmonth$start
start(prmonth)

# последний день периода
prmonth$end
end(prmonth)

# последовательность дат
prmonth$sequence
seq(prmonth)

# количество дней входящих в период
prmonth$length
length(prmonth)

يمكنك أيضًا الحصول على أي من المكونات باستخدام الوسيطة جزء، الموجود في كل وظيفة من وظائف الحزمة. القيم المحتملة: البداية، النهاية، التسلسل، الطول.

previous_month(part = "start")    # начало периода
previous_month(part = "end")      # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length")   # количество дней в периоде

لذلك دعونا نلقي نظرة على جميع الوسائط المتاحة في وظائف الحزمة timeperiodsR:

  • x — التاريخ المرجعي الذي سيتم حساب الفترة الزمنية منه، التاريخ الحالي افتراضيًا؛
  • n — عدد الفترات التي سيتم تضمينها في الفترة، على سبيل المثال الأسابيع الثلاثة الماضية؛
  • part - أي مكون من الكائن tpr تحتاج إلى الحصول عليها، بشكل افتراضي all;
  • week_start — الوسيطة موجودة فقط في الوظائف الخاصة بالعمل مع الأسابيع، وتسمح لك بتعيين عدد أيام الأسبوع التي سيتم اعتبارها بدايته. بشكل افتراضي، تكون بداية الأسبوع هي يوم الاثنين، ولكن يمكنك تعيين أي يوم من 1 - من الاثنين إلى 7 - الأحد.

وبالتالي، يمكنك حساب أي فترة زمنية مرتبطة بالتاريخ الحالي أو أي تاريخ محدد آخر؛ فيما يلي بعض الأمثلة الإضافية:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Time period: from  9 September of 2019, Monday to 29 September of 2019, Sunday

6 أكتوبر هو الأحد:
العمل مع التواريخ في R (الإمكانيات الأساسية، بالإضافة إلى حزم lubridate وtimeperiodsR)

نحن بحاجة إلى فترة، بالنسبة إلى 6 أكتوبر، ستستغرق الأسابيع الثلاثة السابقة. ولا يشمل الأسبوع الذي يشمل 3 أكتوبر نفسه. وعليه فهذه هي الفترة من 6 إلى 9 سبتمبر.

العمل مع التواريخ في R (الإمكانيات الأساسية، بالإضافة إلى حزم lubridate وtimeperiodsR)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Time period: from  1 May of 2019, Wednesday to 31 May of 2019, Friday

في هذا المثال، نحن مهتمون بالشهر الذي كان قبل 4 أشهر، إذا بدأنا من 16 سبتمبر 2019، فهو مايو 2019.

تصفية متجه التواريخ باستخدام timeperiodR

لتصفية التواريخ timeperiodsR هناك العديد من المشغلين:

  • %left_out% - يقارن بين كائنين من فئة tpr، ويعيد القيمة من العنصر الأيسر المفقود في العنصر الأيمن.
  • %left_in% - يقارن كائنين من فئة tpr، ويعيد التواريخ من الكائن الأيسر المضمن في الكائن الأيمن.
  • %right_out% - يقارن بين كائنين من فئة tpr، ويعيد القيمة من العنصر الأيمن المفقود من العنصر الأيسر.
  • %right_in% - يقارن كائنين من فئة tpr، ويعيد التواريخ من الكائن الأيمن الموجود في الكائن الأيسر.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # получить даты из period1 которые входят в period2
period1 %left_out% period2  # получить даты из period1 которые не входят в period2
period1 %right_in% period2  # получить даты из period2 которые входят в period1
period1 %right_out% period2 # получить даты из period2 которые не входят в period1

في الحزمة timeperiodsR هناك واحدة رسمية باللغة الروسية قائمة تشغيل يوتيوب.

اختتام

لقد درسنا بالتفصيل فئات الكائنات المصممة بلغة R للعمل مع التواريخ. يمكنك الآن أيضًا إجراء العمليات الحسابية على التواريخ، والحصول بسرعة على أي فترات زمنية باستخدام الحزمة timeperiodsR.

إذا كنت مهتمًا بلغة R، أدعوك للاشتراك في قناتي على التليجرام R4marketing، والذي أشارك فيه بشكل يومي مواد مفيدة حول استخدام لغة R في حل مشاكلك اليومية.

المصدر: www.habr.com

إضافة تعليق