R 的午夜时间日期时间 (00:00:00) 的 strptime 给出 NA

opy*_*ate 5 r

R\ 的基本strptime函数给了我意想不到的输出。

\n\n

这按预期工作:

\n\n
strptime(20130203235959, "%Y%m%d%H%M%S")\n# yields "2013-02-03 23:59:59"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个也是:

\n\n
strptime(20130202240000, "%Y%m%d%H%M%S")\n# yields "2013-02-03"\n
Run Code Online (Sandbox Code Playgroud)\n\n

...但这不是。为什么?

\n\n
strptime(20130203000000, "%Y%m%d%H%M%S")\n# yields NA\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

该值20130204000000显示在我使用以下命令在 Mac 10.7.5 系统上生成的日志中:

\n\n
strptime(20130203235959, "%Y%m%d%H%M%S")\n# yields "2013-02-03 23:59:59"\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新2

\n\n

我什至尝试过lubridate,这似乎是推荐:

\n\n
> parse_date_time(c(20130205000001), c("%Y%m%d%H%M%S"))\n 1 parsed with %Y%m%d%H%M%S\n[1] "2013-02-05 00:00:01 UTC"\n> parse_date_time(c(20130205000000), c("%Y%m%d%H%M%S"))\n1 failed to parse.\n[1] NA\n
Run Code Online (Sandbox Code Playgroud)\n\n

...然后有趣的是,当我添加足够的秒数到达now()午夜时,它打印出“00:00:00”:

\n\n
> now() + new_duration(13000)\n[1] "2013-02-10 00:00:00 GMT"\n
Run Code Online (Sandbox Code Playgroud)\n

opy*_*ate 2

当我解析日期时,我应该使用character而不是:numeric

> strptime(20130203000000, "%Y%m%d%H%M%S")    # No!
[1] NA
> strptime("20130203000000", "%Y%m%d%H%M%S")  # Yes!
[1] "2013-02-03"
Run Code Online (Sandbox Code Playgroud)

这样做的原因似乎是我的numeric值被转换为character,并且我使用了太多的数字:

> as.character(201302030000)
[1] "201302030000"
> as.character(2013020300000)
[1] "2013020300000"
> as.character(20130203000000)
[1] "2.0130203e+13"       # This causes the error: it doesn't fit "%Y%m%d%H%M%S"
> as.character(20130203000001)
[1] "20130203000001"      # And this is why anything other than 000000 worked.
Run Code Online (Sandbox Code Playgroud)

从文档中找出所需类型的快速课程:在 R 中,执行help(strptime)并看到类似于下图的弹出窗口。

  • 红色箭头指向函数的主要参数,但未指定类型(这就是我刚刚尝试的原因numeric
  • 绿色箭头指向文档标题中的类型。

在此输入图像描述