使用 R 語言處理日期(基本功能,以及 lubridate 和 timeperiodsR 包)

以任何程式語言取得當前日期,相當於「Hello world!」的操作R語言也不例外。

在本文中,我們將了解如何在 R 語言的基本語法中處理日期,並了解幾個有用的包,這些包在處理日期時擴展了其功能:

  • lubridate — 一個允許您在日期之間執行算術計算的包;
  • timeperiodsR — 用於處理時間間隔及其組成部分的套件。

使用 R 語言處理日期(基本功能,以及 lubridate 和 timeperiodsR 包)

Содержание

如果您對數據分析感興趣,特別是 R 語言,您可能會對我的文章感興趣 電報 и YouTube的 渠道。 大部分內容專門介紹 R 語言。

  1. 使用基本 R 語法處理日期
    1.1. 將文字轉換為日期
    1.2. 在基本 R 中提取日期組件
  2. 使用 lubridate 套件處理日期
    2.1. 使用 lubridate 將文字轉換為日期
    2.2. 使用 lubridate 套件提取日期元件
    2.3. 日期算術運算
  3. 簡化使用 period、timeperiodsR 套件的工作
    3.1. 時間段R中的時間間隔
    3.2. 使用 timeperiodsR 過濾日期向量
  4. 結論

使用基本 R 語法處理日期

將文字轉換為日期

Basic R 有一組用來處理日期的函數。 基本語法的缺點是函數名稱和參數的大小寫非常分散,幾乎沒有邏輯聯繫。 但是,您需要了解該語言的基本功能,因此我們將從它們開始。

大多數情況下,從 csv 檔案或其他來源將資料載入到 R 時,您會收到文字形式的日期。 若要將文字轉換為正確的資料類型,請使用該函數 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
月份名稱的縮寫(apr、mar、...)

%B
完整的月份名稱

%y
兩位數年份指定

%Y
四位數年份指定

%j
一年中的天數 (001 - 366)

%U
一年中的週數 (00 - 53),一週的開始星期日

%W
一年中的周數 (00 - 53),每週星期一的開始

因此,「26年2019月XNUMX日」是月、日、年的全名。 這種日期格式可以使用運算子來描述,如下所示:"%B %d, %Y".

在哪裡:

  • %B — 月份的全名
  • %d — 一個月中的天數
  • %Y — 四位數年份名稱

描述日期格式時,包含字串中的所有其他字元(例如破折號、逗號、句點、空格等)非常重要。 在我的例子中,“September 26, 2019”,日期後面有一個逗號,你還需要在格式描述中添加一個逗號:"%B %d, %Y".

在某些情況下,您收到的日期不僅不符合標準格式 (年-月-日或年/月/日),而且採用的語言也不同於作業系統上安裝的預設語言。 例如,您下載的資料的日期如下所示:「15 年 2019 月 XNUMX 日」。 將此字串轉換為日期之前,您需要更改區域設定。

# Меняем локаль
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 種儲存時間戳記的資料類型: POSIXt, POSIXct。 這些類別之間的主要區別 日期 是除了日期之外他們還儲存時間。

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

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

# "POSIXct" "POSIXt"

功能 Sys.time() 以以下格式傳回目前日期和時間 POSIXct。 這種格式的意思類似於 UNIX時間,並儲存自 UNIX 時代開始以來的秒數 (31年1969月1日至1970年XNUMX月XNUMX日午夜(UTC)).

POSIXt 它還存儲時間和日期及其所有組成部分。 因此,它是一個結構更複雜的對象,但從中很容易獲得任何日期和時間組件,因為實際上 POSIXt.

# Получаем текущую дату и время
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」;
  • format — 表示傳遞給 x 參數的資料的日期格式的描述;
  • origin — 僅在將數字轉換為 POSIX 時使用;您必須將一個日期物件和從其開始計算秒數的時間傳遞給此參數。 通常用於從 UNIXTIME 進行翻譯。

如果您的日期和時間資訊位於 UNIX時間,然後將它們轉換為清晰、可讀的日期,請使用以下範例:

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

在 origin 中您可以指定任何時間戳記。 例如,如果您的資料包含日期和時間,即自 15 年 2019 月 12 日中午 15:XNUMX 以來的秒數,則要將其轉換為日期,請使用:

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

使用 lubridate 套件處理日期

lubridate 也許是 R 語言中最受歡迎的日期處理包。它為您提供了三個附加類別。

  • 持續時間 - 持續時間,即兩個時間戳之間的秒數;
  • period - 句點可讓您以人類可讀的間隔在日期之間進行計算:天、月、週等;
  • 間隔 - 提供時間起點和終點的物件。

R語言中附加套件的安裝是使用標準函數進行的 install.packages().

安裝包 lubridate:

install.packages("lubridate")

使用 lubridate 將文字轉換為日期

封裝特點 lubridate 顯著簡化了將文字轉換為日期的過程,並且還允許您對日期和時間進行任何算術運算。

這些函數將幫助您取得當前日期或日期和時間 today() и now().

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

將字串轉換為日期 lubridate 有一個完整的函數系列,其名稱始終由三個字母組成,並指示日期組件的順序:

  • y - 年
  • m——月
  • 諾曼地登陸日

透過 lubridate 將文字轉換為日期的函數列表

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

將字串轉換為日期的一些範例:

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

如你看到的 lubridate 它將日期描述識別為文字的效率要高得多,並且允許您將文字轉換為日期,而無需使用其他運算符來描述格式。

使用 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 года назад

簡化了 period、timeperiodsR 包的工作。

timeperiodsR — 2019 年 XNUMX 月在 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()

之後你會有一個對象 時間,從中可以輕鬆獲得以下組件:

  • 該期間的開始日期,在我們的範例中是最後一個月
  • 期間結束日期
  • 期間所包含的天數
  • 期間包含的日期順序

此外,您可以透過不同的方式取得每個組件:

# первый день периода
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 月 XNUMX 日是星期日:
使用 R 語言處理日期(基本功能,以及 lubridate 和 timeperiodsR 包)

我們需要一個相對於 6 月 3 日而言需要前 6 週時間的時期。 不包括 9 月 29 日所在的那一週。 因此,這是從XNUMX月XNUMX日到XNUMX月XNUMX日的時期。

使用 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 日開始,那就是 XNUMX 年 XNUMX 月。

使用 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 有一個官方的俄語版本 YouTube 播放清單.

結論

我們詳細研究了用 R 語言設計的用於處理日期的物件類別。 現在您還可以對日期執行算術運算,並使用該套件快速獲取任何時間段 timeperiodsR.

如果你對R語言有興趣,我邀請你訂閱我的telegram頻道 R4行銷,其中我每天分享有關使用 R 語言解決日常問題的有用資料。

來源: www.habr.com

添加評論