使用R语言中的日期(基本功能以及lubridate和timeperiodsR包)

使用任何编程语言获取当前日期,该操作等效于“ Hello world!”。 语言R也不例外。


在本文中,我们将研究日期在基本R语法中的工作方式,并探讨一些有用的软件包,这些软件包可扩展使用日期时的功能:


  • lubridate允许在日期之间进行算术计算的软件包;
  • timeperiodsR用于处理时间间隔及其组成部分的软件包。




目录内容


  1. 使用基本的R语法处理日期
    1.1。 将文字转换为日期
    1.2。 检索Base R中的日期组件
  2. 使用lubridate软件包处理日期
    2.1。 使用lubridate将文本转换为日期
    2.2。 使用lubridate包检索日期成分
    2.3。 有日期的算术运算
  3. 带周期,timeperiodsR包的简化工作
    3.1。 时间间隔中的时间间隔
    3.2。 使用timeperiodsR过滤日期向量
  4. 结论



使用基本的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-DDYYYY / MM / DD
如果数据集中的日期采用任何其他格式,则可以使用format参数进行转换。


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

格式接受表示任何时间间隔及其格式的字符串形式的运算符,下表中显示了最常用的值:


格式内容描述
%d月中的天数
%a周几名称的缩写
%A星期几的全名
%w星期几(0-6,其中0是星期日)
%米两位数的月份指定(01-12)
%b月名称的缩写(apr,mar,...)
%B月份全称
%y两位数年份指定
%Y四位数年份指定
%j一年中的天数(001-366)
一年中的第几周(00-53),周日开始
%W一年中的第几周(00-53),周一开始

因此,“ 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对象的主要类之外,还有两种存储时间戳的数据类型: POSIXltPOSIXct 。 这些类和日期之间的主要区别在于它们除了存储日期外还存储时间。


 #      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具有一系列函数,其名称始终由三个字母组成,并指示一系列日期成分:


  • y年
  • m-月
  • d-天

通过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日是星期日:
十月6,2019


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


从2019年10月6日开始的3周




 #     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语言解决日常任务的有用材料。

Source: https://habr.com/ru/post/zh-CN469215/


All Articles