我正试图用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")
答案 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