在 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 语言解决日常问题的有用材料。

来源: habr.com

添加评论