کار با تاریخ ها در R (قابلیت های اساسی و همچنین بسته های lubridate و timeperiodsR)

تاریخ فعلی را در هر زبان برنامه نویسی دریافت کنید، عملیاتی معادل "Hello world!" زبان R نیز از این قاعده مستثنی نیست.

در این مقاله، نحوه کار با تاریخ ها را در نحو اصلی زبان R بررسی خواهیم کرد و همچنین به چندین بسته مفید که قابلیت های آن را در هنگام کار با تاریخ گسترش می دهند، نگاه خواهیم کرد:

  • lubridate - بسته ای که به شما امکان می دهد محاسبات حسابی بین تاریخ ها انجام دهید.
  • timeperiodsR - بسته ای برای کار با فواصل زمانی و اجزای آنها.

کار با تاریخ ها در R (قابلیت های اساسی و همچنین بسته های lubridate و timeperiodsR)

مقدار

اگر به تجزیه و تحلیل داده ها و به ویژه زبان R علاقه مند هستید، ممکن است به من علاقه مند باشید تلگراف и یوتیوب کانال ها بیشتر مطالب به زبان R اختصاص داده شده است.

  1. کار با تاریخ در نحو اصلی R
    1.1. تبدیل متن به تاریخ
    1.2. استخراج اجزای تاریخ در R پایه
  2. کار با خرما با استفاده از بسته روغن کاری
    2.1. با استفاده از lubridate متن را به تاریخ تبدیل کنید
    2.2. استخراج اجزای خرما با استفاده از بسته روان کننده
    2.3. عملیات حسابی با تاریخ
  3. کار ساده شده با دوره، بسته timeperiodsR
    3.1. فواصل زمانی در بازه های زمانیR
    3.2. فیلتر کردن بردار تاریخ با استفاده از timeperiodsR
  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() تاریخ را در دو قالب می پذیرد: YYYY-MM-DD یا YYYY/MM/DD.
اگر مجموعه داده های شما حاوی تاریخ هایی در قالب دیگری است، می توانید از آرگومان استفاده کنید 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 پایه 2 نوع داده دیگر وجود دارد که مهر زمانی را ذخیره می کنند: POSIXlt, POSIXct. تفاوت اصلی بین این کلاس ها و تاریخ این است که علاوه بر تاریخ ذخیره زمان.

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

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

# "POSIXct" "POSIXt"

تابع Sys.time() تاریخ و زمان فعلی را در قالب برمی گرداند POSIXct. این قالب از نظر معنی مشابه است یونیکس تایم، و تعداد ثانیه های از آغاز دوره یونیکس را ذخیره می کند (نیمه شب (UTC) از 31 دسامبر 1969 تا 1 ژانویه 1970).

کلاس POSIXlt همچنین زمان و تاریخ و تمام اجزای آنها را ذخیره می کند. بنابراین، این یک شی با ساختار پیچیده تر است، اما به راحتی می توان هر جزء تاریخ و زمان را از آن به دست آورد زیرا در حقیقت POSIXlt این فهرست.

# Получаем текущую дату и время
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  # часовой пояс

تبدیل داده های عددی و متنی به فرمت POSIX* توسط توابع انجام می شود as.POSIXct() и as.POSIXlt(). این توابع دارای مجموعه کوچکی از آرگومان ها هستند.

  • x - عدد، رشته یا شیء کلاس تاریخ، که باید تبدیل شود؛
  • tz - منطقه زمانی، پیش‌فرض "GMT"؛
  • قالب - شرح فرمت تاریخ که در آن داده های ارسال شده به آرگومان x نشان داده می شود.
  • مبدا - فقط هنگام تبدیل یک عدد به 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 یک خانواده کامل از توابع وجود دارد که نام آنها همیشه از سه حرف تشکیل شده است و دنباله اجزای تاریخ را نشان می دهد:

  • y - سال
  • متر - ماه
  • د - روز

فهرستی از توابع برای تبدیل متن به تاریخ از طریق 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 - یک بسته جدید برای کار با تاریخ ها که در سپتامبر 2019 در CRAN منتشر شد.

نصب پکیج timeperiodsR:

install.packages("timeperiodsR")

هدف اصلی تعیین سریع یک بازه زمانی معین نسبت به یک تاریخ معین است. به عنوان مثال، با استفاده از توابع آن به راحتی می توانید:

  • هفته، ماه، سه ماهه یا سال گذشته را در R دریافت کنید.
  • تعداد مشخصی از فواصل زمانی نسبت به یک تاریخ، به عنوان مثال 4 هفته گذشته را دریافت کنید.
  • به راحتی می توان اجزای آن را از بازه زمانی حاصل استخراج کرد: تاریخ شروع و پایان، تعداد روزهای گنجانده شده در فاصله، کل توالی تاریخ هایی که در آن گنجانده شده است.

نام تمام توابع بسته timeperiodsR شهودی هستند و از دو بخش تشکیل شده اند: جهت_فاصله، جایی که:

  • جهت که در آن باید نسبت به تاریخ معین حرکت کنید: last_n، previous، this، next، 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()

پس از آن شما یک شی خواهید داشت ماهانه کلاس Tprکه به راحتی می توان اجزای زیر را از آن بدست آورد:

  • تاریخ شروع دوره، در مثال ما این آخرین ماه است
  • تاریخ پایان دوره
  • تعداد روزهای گنجانده شده در دوره
  • توالی تاریخ های گنجانده شده در دوره

علاوه بر این، شما می توانید هر یک از اجزاء را به روش های مختلف دریافت کنید:

# первый день периода
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 - تعداد فواصل زمانی که در دوره گنجانده می شود، به عنوان مثال 3 هفته قبل؛
  • 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 سپتامبر تا 29 سپتامبر است.

کار با تاریخ ها در 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 بوده است.

فیلتر کردن بردار تاریخ با استفاده از timeperiodsR

برای فیلتر کردن تاریخ ها در 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 علاقه مند هستید از شما دعوت می کنم در کانال تلگرام من عضو شوید بازاریابی R4، که در آن مطالب مفیدی را به صورت روزانه در مورد استفاده از زبان R در حل مشکلات روزمره به اشتراک می گذارم.

منبع: www.habr.com

اضافه کردن نظر