使用as.Date()时获取NA

时间:2016-07-22 13:20:29

标签: r datetime

感谢下面的评论,我意识到我应该"%b"使用"FEB"(原来我使用"%m";感谢您对?strptime的引用。但我的问题仍然存在。

当我这样做时

as.Date("13-FEB-15", "%d-%b-%y")
# [1] NA

我知道这会奏效:

as.Date("13-02-2015", "%d-%m-%Y")
# [1] "2015-02-13"

但是有没有办法避免将FEB转换为0215转换为2015以获得我的预期结果?谢谢!

2 个答案:

答案 0 :(得分:2)

一般且有用的诊断

试试这个,你会得到什么?

format(strptime(Sys.Date(), format="%Y-%m-%d"), "%y-%b-%d")

我得到了

[1] "16- 7月-22"
哈哈,中间人是中国人。出了什么问题?没有错。问题是%b对您当前的区域设置很敏感。当您阅读?strptime时,请特别注意哪种格式对您当前的区域设置敏感。

我的语言环境是:

Sys.getlocale("LC_TIME")
#[1] "zh_CN.UTF-8"
是的,那是在中国地区。

语言环境在日期时间格式上有所不同。在我的机器上:

as.Date("16-JUL-22", "%y-%b-%d")
# NA
as.Date("16- 7月-22", "%y-%b-%d")
#[1] "2016-07-22"

现在让我们重置时间区域:

Sys.setlocale("LC_TIME", "C")
as.Date("16-JUL-22", "%y-%b-%d")
#[1] "2016-07-22"
哇,它有效!请阅读?locales了解更多信息,您将了解locale = "C"的含义。

为您解决方案

Sys.setlocale("LC_TIME", "C")
as.Date("13-FEB-15", format = "%d-%b-%y")

答案 1 :(得分:1)

使用lubridate:

library(lubridate)
date1 = "2014-12-11 00:00:00"
date2 = "14-DEC-11"
ymd_hms(date1) == ymd(date2,tz = "UTC")

这些彼此相等,应该能够加入。