【问题标题】:Why is parsing "%Y-%m" using strptime in R giving an NA result, but "%Y-%m-%d" works? [duplicate]为什么在 R 中使用 strptime 解析“%Y-%m”会给出 NA 结果,但“%Y-%m-%d”有效? [复制]
【发布时间】:2010-12-22 03:24:18
【问题描述】:

我在 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 仍然适用。

【问题讨论】:

  • 因为日期有天数?你期望它输出什么?
  • 你希望那是一年中的一天吗?如果是这样,请尝试“%j”。
  • 我期待它使用当前日期作为默认值,如果你执行 strptime("2009", format="%Y") 会这样做。这导致“2009-12-01”。
  • 在这种情况下为什么不使用 Sys.Date() 呢? “2009-12”本身不是一个有效的日期。

标签: datetime r


【解决方案1】:

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

这是我运行的测试。

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

返回"2009-05-12"

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 所以这只是语言的一种奇怪的特质?
    • 不,它作为“日期”的要求是指一年中的一个月中的一天,而仅仅给出一个月和一年是不等价的。
    • 但是,如果你只给它一年,或者只给它一年零一天,为什么它会起作用呢?
    • 我的猜测是“这就是它的工作原理”(换句话说,没有充分的理由)。正如每个人都在说的那样,为什么您实际上想要这样做并没有多大意义。如果您想要今天的日期,请使用 Sys.Date()。否则,只需按照 Shane 上面的建议进行操作...
    • 我知道这个问题真的很老,但是当我自己有同样的问题时我发现了它。根据documentation on strptime:“对于strptime,输入字符串不需要完全指定日期:假设未指定的秒、分钟或小时为零,并且未指定的年、月或日是当前日期。 "所以它应该“似乎不需要你的解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 2011-10-24
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多