strptime不承认%b /%B?

时间:2014-11-18 15:26:41

标签: r date

我正试图用strptime转换R中的一些日期。我已经阅读this thread并设置了我的语言环境,以便它可以正常工作。例如:

> Sys.getlocale("LC_TIME")
[1] "en_GB"
> format(Sys.time(), format="%B")
[1] "November"

但是,如果我尝试转换月份字符串,则strptime返回NA,例如:

> strptime("November", format="%B")
[1] NA

我可以在上面的链接中运行示例而没有任何问题,但如果我简化示例只包括月份,我会再次获得NA。

> var <- "Thu Nov 8 15:41:45 2012"
> strptime(var, format="%a %b %d %H:%M:%S %Y")
[1] "2012-11-08 15:41:45 GMT"
> strptime("Nov", format="%b")
[1] NA

这里发生了什么?如何将字符月解析为日期对象?

修改 感谢下面的评论。澄清一下,这也行不通:

> strptime("November 2011", format="%B %Y")
[1] NA

我还希望strptime用当前系统时间填写任何缺少的字段,如strptime("2011", format="%Y")

1 个答案:

答案 0 :(得分:5)

strptime中缺少值的情况下,我对R的行为感到有些困惑。文档很清楚:

  

对于strptime,输入字符串不需要完全指定日期:它   假设未指定的秒,分钟或小时为零,并且a   未指定的年,月或日是当前的。有些组件可能会   作为NA返回(但未知的tzone组件由a表示   空字符串)。

但几个月似乎并非总是如此。这是一个特别奇怪的例子:

strptime('Nov-01', '%B-%d')
[1] "2014-11-01"
strptime('2009-Nov', '%Y-%B')
[1] NA

基于上述内容的明显解决方法是创建一个简单的函数。

convert.months <- function(x) 
     strptime(paste(x,strftime(Sys.time(),'%d')), '%b %d')

哪个很丑,但它有效:

convert.months(c("Nov","Dec"))
[1] "2014-11-18 EST" "2014-12-18 EST"

这里要清楚的是测试用例,根据我对文档的解释,这些测试用例都应该有效:

strptime('11', '%m') # Fail
strptime('11-01', '%m-%d') # Works
strptime('2009-11', '%Y-%m') # Fail

strptime('Nov', '%b') # Fail
strptime('Nov-01', '%b-%d') # Works
strptime('2009-Nov', '%Y-%b') # Fail