【问题标题】:R Strptime Year and Month with No Delimiter returning NAR Strptime 年和月,没有分隔符返回 NA
【发布时间】:2011-10-16 03:31:44
【问题描述】:

我可能正在做一些愚蠢的事情而没有看到它,但是:

> strptime("201101","%Y%m")
[1] NA

来自帮助 strptime:

%Y 年份与世纪
%m 以十进制数表示的月份 (01–12)

【问题讨论】:

  • 您发现文档错误与 strptime 必须全部提供年-月-日,这从未在任何地方说明:"对于 strptime,输入字符串不需要完全指定日期:假设未指定的秒、分钟或小时为零,并且未指定的年、月或日是当前的。"
  • 感谢您的评论。更奇怪的是:仅使用“%Y”(在我的计算机上)执行此操作时,它会自动为月份和日期添加“12-27”并返回一个有效值。但是当尝试“%Y-%m”时它返回NA。这开始让我发疯了。

标签: r time


【解决方案1】:

只需粘贴您忽略的日期字段(例如“01”):

R> shortdate <- "201101"
R> as.Date(paste(shortdate, "01", sep=""), "%Y%m%d")
[1] "2011-01-01"
R> 

我更喜欢as.Date() 用于日期,strptime() 用于POSIXct 对象,即日期和时间。

然后您可以将解析后的Date 对象转换为POSIXlt 对象以检索年份和月份:

R> mydt <- as.Date(paste(shortdate, "01", sep=""), "%Y%m%d")
R> myp <- as.POSIXlt(mydt)
R> c(myp$year, myp$mon)
[1] 111   0
R> 

这是标准 POSIX 行为,年份为“年 - 1900”,月份为零索引。

七年后编辑:为了完整起见,并且有人刚刚对此表示赞同,我的 anytime 包中的函数可以提供帮助:

R> anytime::anydate("201101")    ## returns a Date
[1] "2011-01-01"
R> anytime::anytime("201101")    ## returns a Datetime
[1] "2011-01-01 CST"
R> 

使用不同的解析器(来自Boost Date_time,它更慷慨并估算丢失的日期(或第二种情况下的天/小时/分钟/秒)。

【讨论】:

  • 所以在R中你不能说没有天数,你必须注入01的假设。奇怪。
  • 这不是 R 错误吗?因为strptime("11", "%m") 返回NA,而strptime("11", "%d")strptime("11", "%y") 返回合理的结果。好像 R 对 %m 有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
相关资源
最近更新 更多