R中的Var调用返回日期的函数,类称“字符”

时间:2018-05-17 18:53:43

标签: r date subset readline

使用RStudio 1.1.4,努力从源代码运行,但现在正在以交互方式进行测试。尝试按日期获取readline输入和子集我的数据。所以这是框架的数据结构:

'data.frame':   101242 obs. of  10 variables:
$ name      : chr (names)
$ Task_Date : Date, format: "1997-05-09" "1997-05-20" "1997-05-23" "1997-05-28" ...
$ Wo_Num    : chr  "-0-0                             " "-0-0                             " "-0-0                             " "-0-0                             " ...
$ Time_Code : chr  "SH" "SH" "SH" "SH" ...
$ Task_Code : chr  "IND-SH" "IND-SH" "IND-SH" "IND-SH" ...
$ Task      : chr  "SHOP/BREAK TIME" "SHOP/BREAK TIME" "SHOP/BREAK TIME" "SHOP/BREAK TIME" ...
$ hours     : num  2 2 1 1 2 2 2 4 5 8 ...
$ labor_rate: num  0 0 0 0 0 0 0 0 0 0 ...
$ cost      : num  148 148 74 74 148 148 148 296 370 592 ...
$ Shop      : chr  "Radio" "Radio" "Radio" "Radio" ...

以下是功能:

begdate <- function()
{
  n <-  readline(prompt = "Enter begin date:" )
  return(as.Date(n))
}

enddate <- function()
{
  n <-  readline(prompt = "Enter end date:" )
  return(as.Date(n))
}
bdate <- begdate()
edate <- enddate()

这是交互式输出:

  

bdate&lt; - begdate()

输入开始日期:12/31/2017

  

类(bdate)

[1]“character”

(为edate运行它同样如此)

果然,

TLSub&lt; - subset(TechLabor,Task_Date&gt; = bdate)

charToDate(x)出错:   字符串不是标准的明确格式

我在这里缺少什么? 谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

问题不在于子集,而在于转换日期字符串。

首先,我们需要区分日期在R中的内部(数字)表示形式和将日期打印为字符串时的日期格式。

第二,我们必须认识到,在世界范围内,人们习惯于以不同的格式编写日期。 例如,2017年的最后一天可以写为

  • 12/31/2017
  • 12/31/17
  • 31/12/2017
  • 31.12.2017
  • 31.12.17
  • 20171231
  • 2017/12/31
  • 2017-12-31

(如果仅考虑数字格式)。格式的不同之处在于,天,月和年出现在字符串和用于分隔条目的字符中的顺序。

不幸的是,某些格式是模棱两可的,即,您无法确定使用了哪种格式以及如何解释日期字符串。例如,字符串03/04/2017代表什么日期? 2017年4月3日还是2017年3月4日? (如果年份仅由两位数字给出,例如03/04/05,情况会变得更糟。)

这就是为什么as.Date()具有一个format参数的原因,该参数可用于告诉R如何解释给定的日期字符串。

但是,某些格式被称为明确格式,因为R知道如何解释日期字符串而无需其他提示。首先,这是ISO 8601 standard中定义的日期格式YYYY-MM-DD。打印日期时,默认使用此格式,例如

Sys.Date()
[1] "2018-07-04"

在输入时,as.Date()也接受YYYY/MM/DD,例如

as.Date("2017/12/31")
[1] "2017-12-31"

因此,可以通过指定format参数来修改您的两个函数以接受首选格式的日期字符串:

begdate <- function()
{
  n <-  readline(prompt = "Enter begin date:" )
  return(as.Date(n, format = "%m/%d/%Y"))
}

bdate <- begdate(); bdate

现在可以按您期望的格式使用

Enter begin date:12/31/2017
[1] "2017-12-31"

但如果日期字符串与指定格式不匹配,则会返回NA

bdate <- begdate(); bdate
Enter begin date:2017-12-31
[1] NA

在R版本3.5.0(于CRAN于2018-04-23发行)中,as.Date()获得了一个新参数 tryFormats使用format个字符串的字符向量来尝试是否未指定format

begdate <- function()
{
  n <-  readline(prompt = "Enter begin date:" )
  return(as.Date(n, tryFormats = c("%Y-%m-%d", "%Y/%m/%d", "%m/%d/%Y")))
}

现在将正确接受并解释三种不同的格式:

Enter begin date:2017-12-31
[1] "2017-12-31"
Enter begin date:12/31/2017
[1] "2017-12-31"
Enter begin date:2017/12/31
[1] "2017-12-31"