为什么在R中使用strptime解析"%Y-%m"给出NA结果,但"%Y-%m-%d"有效?

ban*_*tic 5 datetime r

我在R中得到的结果我不明白

如果我使用strptime格式为%Y-%m的年份和日期(如"2009-12"),我会得到NA结果.但是如果我添加一天,比如"2009-12-01",并相应地更改格式字符串,我会得到一个结果.例:

> strptime("2009-12",format="%Y-%m")
[1] NA
> strptime("2009-12-03",format="%Y-%m-%d")
[1] "2009-12-03"
Run Code Online (Sandbox Code Playgroud)

这是为什么?

更新:我很好奇的是为什么strptime不会解析一年零一个月,而且它不会这样做的原因似乎很奇怪,因为它确实解析了一年,或一年 - 和 -一天:

> strptime("2009",format="%Y") # year only. Works. Uses current month and day as defaults.
[1] "2009-12-02"
> strptime("2009-03",format="%Y-%d") # year and day. Works. Uses current month as default.
[1] "2009-12-03"
> strptime("2009-03",format="%Y-%m") # year and month. Doesn't work. ?
[1] NA
Run Code Online (Sandbox Code Playgroud)

更新解释为什么这不是重复 在这个问题之后几年问了可能的副本,它关注的是一个单独的API R:asDate函数.这个问题是关于3.1.3中仍然适用的strptime功能的怪癖R.

Sha*_*ane 1

对我来说,这似乎是明智的行为。在我看来,更好的问题是“为什么它允许你这样做:strptime("2009-03",format="%Y-%d")?”

这是一种解决方法,可以实现我认为您想要实现的目标(即具有指定月份和年份但今天的 POSIXlt 对象):

as.POSIXlt(paste("2009-12", days(Sys.Date()), sep="-"))
Run Code Online (Sandbox Code Playgroud)

  • 我知道这个问题确实很老,但当我自己有同样的问题时我发现了它。根据`strptime`的[文档](http://stat.ethz.ch/R-manual/R-patched/library/base/html/strptime.html):“对于strptime,输入字符串不需要指定完全日期:假设未指定的秒、分钟或小时为零,未指定的年、月或日为当前日期。” 所以它应该“似乎不需要你的解决方法。 (5认同)
  • 不,它是一个要求,因为“日期”指定一年中一个月中的一天,仅给出一个月和一年并不等同。 (2认同)