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

时间:2009-12-01 19:09:13

标签: 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"

为什么?

更新:我很好奇的是为什么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

更新解释为何不重复 在此问题之后的几年内询问了可能的重复项,它涉及R中的单独API:asDate函数。这个问题是关于strptime函数的一个怪癖,R 3.1.3仍然适用。

2 个答案:

答案 0 :(得分:1)

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

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

as.POSIXlt(paste("2009-12", days(Sys.Date()), sep="-"))

答案 1 :(得分:1)

我只是在这里猜测。但如果需要一年零一天的话,可能需要花费一年零一天的时间在1-365(或闰年为366)。您可以使用paste()并在末尾添加-01以获得标准YYYY-MM-DD格式。

这是我跑的测试。

strptime("2009-123",format="%Y-%d")

返回"2009-05-12"