使用任何编程语言获取当前日期,该操作等效于“ Hello world!”。 语言R也不例外。
在本文中,我们将研究日期在基本R语法中的工作方式,并探讨一些有用的软件包,这些软件包可扩展使用日期时的功能:
lubridate
允许在日期之间进行算术计算的软件包;timeperiodsR
用于处理时间间隔及其组成部分的软件包。

目录内容
- 使用基本的R语法处理日期
1.1。 将文字转换为日期
1.2。 检索Base R中的日期组件 - 使用lubridate软件包处理日期
2.1。 使用lubridate将文本转换为日期
2.2。 使用lubridate包检索日期成分
2.3。 有日期的算术运算 - 带周期,timeperiodsR包的简化工作
3.1。 时间间隔中的时间间隔
3.2。 使用timeperiodsR过滤日期向量 - 结论
使用基本的R语法处理日期
将文字转换为日期
在基本R中,有一组用于处理日期的函数。 基本语法的缺点是函数的名称和参数的寄存器非常分散,并且几乎没有逻辑连接。 但是,必须知道该语言的基本功能,因此我们将从它们开始。
通常,从csv文件或其他来源将数据加载到R中时,您会以文本形式获取日期。 要将文本as.Date()
为正确的数据类型,请使用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")
格式接受表示任何时间间隔及其格式的字符串形式的运算符,下表中显示了最常用的值:
因此,“ 2019年9月26日”是月,日和年的全名。 您可以使用以下运算符描述此日期格式: "%B %d, %Y"
。
其中:
%B
完整的月份名称%d
月中的天数%Y
四位数的年份指定
描述日期格式时,重要的是包括字符串中的所有其他字符,例如破折号,逗号,句点,空格等。 在我的示例“ 2019年9月26日”中,在日期之后放置逗号,并且还应在格式描述中添加逗号: "%B %d, %Y"
。
在某些情况下,您获得的日期不仅不适合标准格式(YYYY-MM-DD或YYYY / MM / DD) ,而且使用的语言与操作系统中的默认设置不同。 例如,您下载的数据以以下形式表示日期:“ 2019年12月15日”。 将此字符串转换为日期之前,需要更改语言环境。
# Sys.setlocale("LC_TIME", "Russian") # as.Date(" 15, 2019 .", format = "%B %d, %Y")
检索Base R中的日期组件
基本R中没有多少函数可以让您从Date类的对象中提取日期的任何部分。
current_date <- Sys.Date() # weekdays(current_date) # months(current_date) # quarters(current_date) #
除了基类R中的Date对象的主要类之外,还有两种存储时间戳的数据类型: POSIXlt , POSIXct 。 这些类和日期之间的主要区别在于它们除了存储日期外还存储时间。
# current_time <- Sys.time() # current_time class(current_time)
# "POSIXct" "POSIXt"
Sys.time()
函数以POSIXct格式返回当前日期和时间。 此格式的含义与UNIXTIME相似,并存储自UNIX时代(从1969年12月31日到1970年1月1日的午夜(UTC))以来的秒数。
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-要转换的Date类的数字,字符串或对象;
- tz-时区,默认为“ GMT”;
- format-日期格式的描述,其中显示在参数x中传递的数据;
- origin-仅在将数字转换为POSIX时使用,您需要将日期对象传递给此参数以及秒数的开始时间。 通常用于从UNIXTIME进行翻译。
如果您的日期和时间数据以UNIXTIME表示 ,则使用以下示例将其转换为可以理解的日期:
# UNIXTIME as.POSIXlt(1570084639, origin = "1970-01-01")
您可以在原点指定任何时间戳。 例如,如果您的数据中日期和时间表示为从2019年9月15日12:15开始的秒数,那么要将其转换为日期,请使用:
# UNIXTIME 15 2019 12:15 as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")
使用lubridate软件包处理日期
lubridate
也许是R中处理日期最流行的软件包。它为您提供了另外三个类。
- 持续时间-持续时间,即 两个时间戳之间的秒数;
- 句点-句点允许您在人类可以理解的间隔的日期之间执行计算:天,月,周等;
- interval-提供初始和最终时间点的对象。
使用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包检索日期成分
同样使用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年9月在CRAN上发布。
安装timeperiodsR
软件包:
install.packages("timeperiodsR")
主要目的是快速确定相对于给定日期的特定时间间隔。 例如,使用其功能,您可以轻松地:
- 获取R中的上周,月,季度或年份。
- 获取相对于日期的给定数量的时隙,例如最近4周。
- 很容易从获取的时间间隔中提取其组成部分:开始和结束日期,落入该间隔的天数,输入该日期的整个日期序列。
timeperiodsR
软件包的所有功能的名称都很直观,并且由两部分组成: direction _ interval ,其中:
- 相对于给定日期必须移动的方向 :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()
时间间隔中的时间间隔
当您需要基于上周或上个月的数据生成报告时,这些功能很有用。 要获取上个月,请使用具有相同名称的函数previous_month()
:
prmonth <- previous_month()
之后,您将拥有tpr类的prprth对象,从中可以轻松获取以下组件:
- 期间的开始日期,在我们的示例中,这是最后一个月
- 期末日期
- 该期间内包含的天数
- 期间中包含的日期顺序
此外,您可以通过不同的方式获得每个组件:
# prmonth$start start(prmonth) # prmonth$end end(prmonth) # prmonth$sequence seq(prmonth) # prmonth$length length(prmonth)
您还可以使用part参数获取任何组件, part参数存在于每个包函数中。 可能的值:开始,结束,序列,长度。
previous_month(part = "start") # previous_month(part = "end") # previous_month(part = "sequence") # previous_month(part = "length") #
因此,让我们看一下timeperiodsR
包函数中所有可用的参数:
x
从其开始计算时间段的参考日期;默认情况下为当前日期;n
该时间段内将包含的间隔数,例如前3周;tpr
您需要获取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
10月6日是星期日:

我们需要一个相对于10月6日为期的前三个星期。 不包括10月6日这一周。 因此,这是9月9日至29日。

# 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个月前的月份感兴趣,如果我们从2019年9月16日开始,则为2019年5月。
使用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
结论
我们详细检查了使用R语言设计用于日期的对象的类。 现在,您还可以对日期进行算术运算,并使用timeperiodsR
包快速获取任何时间段。
如果您对R语言感兴趣,我邀请您订阅我的电报频道R4marketing ,我每天都会在其中分享有关使用R语言解决日常任务的有用材料。